我的应用程序中有三个接口
public interface FBBase { }
public interface IFoo : FBBase { }
public interface IBar : FBBase { }
我还有一个包含List
和IFoo
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.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();
}
}
答案 0 :(得分:3)
使用Concat
合并列表(转换为IEnumerable<IFBase>
),然后运行Where
和Distinct
逻辑:
result = userObj.foos.Cast<IFBBase>()
.Concat(userObj.bars.Cast<IFBase>())
.Where(x => !discludeTypes.Contains(x.GetType()))
.Distinct()
.ToList();