2016-07-30 34 views
2

我知道有一個LINQ解決方案的地方,我只是無法看到它。我的情況是這樣的:我有一個base class(可以稱之爲,現在)接受一個可變參數,並使用它來初始化一個readonly場,這恰好是一個IReadonlyCollection(讓我們稱之爲這一領域名單) 。 如何平展IEnumerable的IEnumerables連接

我有兩個derived classes(讓我們稱之爲 D1 D2)是做同樣的事情與他們的可變參數的參數,它傳遞給base class構造,沒有任何問題存在。

但是我有三分之一derived class(允許調用此一個 D_1_and_2),衍生自同一base class,B,接受作爲其構造器2陣列,D1[]類型的一個和另一個D2[]類型的參數。

我的問題是,不知何故我來連接List字段與彼此以及與所述第二paramenter的List字段中的所有元素的第一個參數的(將D1[]參數)的所有元素,將所得數組傳遞到base class在施工期間。貝婁是代碼中的問題的例證。

public class CollectionElement 
{ 

} 

public class BaseClass 
{ 
    public readonly IReadOnlyCollection<CollectionElement> TheCollection; 

    public BaseClass(params CollectionElement[] arg) 
    { 
     TheCollection = Arrays.AsReadOnly(arg); 
    } 
} 

public class DerivedClassA : BaseClass 
{ 
    public DerivedClass(params CollectionElement[] arg) 
     :base(arg){} 
} 

public class DerivedClassB : BaseClass 
{ 
    public DerivedClass(params CollectionElement[] arg) 
     :base(arg){} 
} 

public class DerivedClassA_Plus_B : BaseClass 
{ 
    public DerivedClass(DerivedClassA[] argA, DerivedClassB[] argB) 
     :base(/*[don't know]*/){} 
} 

回答

4

我認爲你正在尋找Enumerable.SelectMany項目,然後壓平的元素,然後Enumerable.Concat兩個序列連接在一起。

public class DerivedClassA_Plus_B : BaseClass 
{ 
    public DerivedClass(DerivedClassA[] argA, DerivedClassB[] argB) 
     :base(Combine(argA, argB)) { } 

    private static CollectionElement[] Combine(DerivedClassA[] argA, DerivedClassB[] argB) 
    { 
     var a = argA.SelectMany(x => x.TheCollection); 
     var b = argB.SelectMany(x => x.TheCollection); 
     return a.Concat(b).ToArray(); 
    } 
} 
+0

就是這樣!謝謝! – FinnTheHuman