2016-08-26 7 views
2

は私が2つのリストを作成し、各リストに各値をキャストし、リストを結合する複雑なLINQクエリ?

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

私も両方IFooListIBar

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

を保持しているクラスと、これらのインタフェースを実装するいくつかのクラスを持っている私のアプリケーションでは3つのインターフェースを持っている

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

別のクラスでは、私はでいくつかの仕事をしています10個のオブジェクト。私は、FBUser.foosFBUser.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(); 
    } 
} 

答えて

3

使用Concatは(IEnumerable<IFBase>に変換)のリストをマージして、WhereDistinctロジックを実行する:

result = userObj.foos.Cast<IFBBase>() 
      .Concat(userObj.bars.Cast<IFBase>()) 
      .Where(x => !discludeTypes.Contains(x.GetType())) 
      .Distinct() 
      .ToList(); 
関連する問題