2016-08-26 2 views
2

У меня есть три интерфейса в моем приложенииКомплексный запрос LINQ для создания двух списков, каждого значения в каждом списке и объединения списков?

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(); 
    } 
} 

ответ

3

Используйте Concat, чтобы объединить списки (преобразуется в IEnumerable<IFBase>), а затем запустить Where и Distinct логика:

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