2016-07-30 10 views
2

Je sais qu'il existe une solution LINQ quelque part, je ne peux pas le voir. La situation que je pose est la suivante: j'ai base class (laisse l'appeler B, pour l'instant) qui accepte un vararg et l'utilise pour initialiser un champ readonly, qui se trouve être un IReadonlyCollection (Appelons ce champ Liste) . Comment aplanir la concaténation de IEnumerables de IEnumerables

J'ai deux derived classes (permet de les appeler D1 et D2) qui font exactement la même chose avec leur argument vararg, en passant au constructeur base class, aucun problème.

Mais j'ai une troisième derived class (permet d'appeler celui-ci D_1_and_2), dérivé du même base class, B, qui accepte en tant que paramètres pour son constructeur 2 tableaux, l'un de type D1[] et l'autre de type D2[] .

Mon problème est, en quelque sorte, je dois concaténer tous les éléments du premier de paramètre (le paramètre D1[]) List champs avec l'autre et avec tous les éléments de List champs de la deuxième paramenter et passer le tableau résultant à la base class lors de la construction. Bellow est une illustration du problème dans le 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]*/){} 
} 

Répondre

4

Je pense que vous cherchez Enumerable.SelectMany à projeter, puis aplatir les éléments, puis Enumerable.Concat pour joindre les deux séquences ensemble.

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

C'était tout! Merci! – FinnTheHuman