构建两个列表的复杂LINQ查询,强制转换每个列表中的每个值,以及组合列表
本文关键字:列表 转换 组合 查询 两个 复杂 构建 LINQ | 更新日期: 2023-09-27 18:04:04
我的应用程序中有三个接口
public interface FBBase { }
public interface IFoo : FBBase { }
public interface IBar : FBBase { }
我也有一个类,包含IFoo
和IBar
的List
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
对象。我想收集一个包含FBUser.foos
和FBUser.bars
中每个唯一引用的List<IFBBase>
。此外,我还想从List<IFBBase>
中排除某些Type
。
有比这更干净的方法吗?这是正确的做法吗?
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>
),然后运行Where
和Distinct
逻辑:
result = userObj.foos.Cast<IFBBase>()
.Concat(userObj.bars.Cast<IFBase>())
.Where(x => !discludeTypes.Contains(x.GetType()))
.Distinct()
.ToList();