2016-07-30 28 views
2

glätten kann Ich weiß, dass es irgendwo eine LINQ Lösung gibt, ich kann es einfach nicht sehen. Die Situation, die ich habe ist folgendes: Ich habe ein base class (nennen wir es können B, denn jetzt), die eine Vararg akzeptiert und verwendet es eine readonly Feld zu initialisieren, die ein IReadonlyCollection (nennen wir dieses Feld Liste) passiert sein . Wie man die Verkettung von IEnumerables von IEnumerables

Ich habe zwei derived classes (nennen wir sie D1 und D2), die genau die gleiche Sache mit ihren Vararg Argument tun, um es in die base class Konstruktor, keine Probleme gibt.

Ich habe aber ein drittes derived class aus, abgeleitet (dieses D_1_and_2 einem lässt nennen) die gleiche base class, B, die für den Konstruktor 2 Arrays als Parameter übernimmt, eine vom Typ D1[] und die andere vom Typ D2[] .

Mein Problem ist, irgendwie muss ich die alle Elemente des ersten Parameters verketten (der D1[] Parameter) List Felder miteinander und mit all den Elementen der zweiten List Felder des Paramenter und übergeben die resultierenden Array der base class während der Konstruktion. Unten ist eine Illustration des Problems im Code.

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]*/){} 
} 

Antwort

4

Ich glaube, du bist für Enumerable.SelectMany Suche zu projizieren und dann die Elemente abzuflachen, und dann Enumerable.Concat die beiden Sequenzen miteinander zu verbinden.

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

Das war es! Vielen Dank! – FinnTheHuman