复杂的LINQ查询构建两个列表,在每个列表中转换每个值,并组合列表?

时间:2016-08-26 13:51:56

标签: c# linq

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

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

我还有一个包含ListIFoo

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

一些实现这些接口的类

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

在另一个课程中,我使用FBUser个对象。我想收集一个List<IFBBase>,其中包含FBUser.foosFBUser.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();
    }
}

1 个答案:

答案 0 :(得分:3)

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

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