c# - 复杂的 LINQ 查询来构建两个列表、转换每个列表中的每个值并组合列表?

标签 c# linq

我的应用程序中有三个接口(interface)

public interface FBBase { }
public interface IFoo : FBBase { }
public interface IBar : FBBase { }

我还有一个包含 List 的类两者 IFooIBar

public class FBUser
{
    public List<IFoo> foos { get; set; }
    public List<IBar> bars { get; set; }
}

以及一些实现这些接口(interface)的类

public class Fee : IFoo { }
public class Baz : IBar { }
public class PhiBat : IFoo, IBar { }

在另一个类中,我用 FBUser 做了一些工作。对象。我想收藏一个List<IFBBase>包含 FBUser.foos 中的每个唯一引用和FBUser.bars 。此外,我还想排除某些Type来自List<IFBBase> .

还有比这更干净的方法吗?这是正确的方法吗?

public class FBUserWorker
{
    List<Type> discludeTypes { get; set; } = new List<Type>();

    public FBUserWorker()
    {
        discludeTypes.Add(typeof(PhiBat));
    }

    public void DoWork(FBUser userObj)
    {
        var fbBaseList = userObj.foos.Where(x => !discludeTypes.Contains(x.GetType())).Cast<IFBBase>().ToList();
        fbBaseList.AddRange(userObj.bars.Where(x => !discludeTypes.Contains(x.GetType())).Cast<IFBBase>().ToList());
        fbBaseList = fbBaseList.Distinct().ToList();
    }
}

最佳答案

使用Concat合并列表(转换为 IEnumerable<IFBase> ),然后运行 ​​WhereDistinct逻辑:

result = userObj.foos.Cast<IFBBase>()
            .Concat(userObj.bars.Cast<IFBase>())
            .Where(x => !discludeTypes.Contains(x.GetType()))
            .Distinct()
            .ToList();

关于c# - 复杂的 LINQ 查询来构建两个列表、转换每个列表中的每个值并组合列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39167980/

相关文章:

wpf - Excel 文档内容到 Web 服务

c# - 如何在 linq 中对子列表求和?

c# - 是否可以通过一个应用程序发送具有不同监听连接字符串的通知?

javascript - 从 ViewBag 加载文件?

c# - 为什么 WPF 中任何元素的 TabIndex 属性都是 2147483647?

c# - 有效地将项目添加到列表<类>中并行 C#

Linq - 将查询表达式转换为点符号

c# - 没有重复的随机数生成器

c# - 如何通过单独搜索扩展名来获得单个文件名?

c# - LINQ 获得最高值并 + 1