2017-10-10 2 views
1

Dans une classe, je traite une liste de IInterface.Fusionner deux listes de classes implémentant la même interface

Je veux les deux implémentations possibles à traiter de manière séparée, d'où:

public List<IInterface> Process(List<IInterface> InterfaceList) 
{ 
    List<FirstImplementation> FirstList = FirstProcess(InterfaceList.OfType<FirstImplementation>.ToList()); 

    List<SecondImplementation> SecondList = SecondProcess(InterfaceList.OfType<SecondImplementation>.ToList()); 

    return new List<IInterface> { 
    FirstList, 
    SecondList 
}; 

} 

Je voudrais revenir un List<IInterface>, même que l'entrée, à la fois, il se révèle être plus difficile que prévu

return new List<IInterface> { 
    FirstList, 
    SecondList 
}; 

compiles mais lève une InvalidCastException lors de l'exécution,

return new List<IInterface>.AddRange(FirstList).AddRange(SecondList); 

ne compile même pas ...

Quelle serait la bonne façon de faire cela?

+0

Votre dernier exemple est presque correct. Il manque une parenthèse et 'AddRange' a un type de retour' void' donc vous ne pouvez pas l'enchaîner: 'var ret = new Liste (); ret.AddRange (FirstList); ret.AddRange (SecondList); return ret; ' –

Répondre

7

LINQ:

return FirstList.Cast<IInterface>().Concat(SecondList.Cast<IInterface>()).ToList(); 

Cast<> retourne (exécution différée de l'esprit LINQ) un dénombrable avec des éléments exprimés au type de cible, Concat combine deux enumerables et ToList transforme le résultat dans une liste (et matérialise la requête LINQ). Comme @Evk l'a aimablement remarqué, quand il y a une distribution implicite des deux types au type de sortie (comme dans votre cas, vous pouvez convertir vos deux types en leur interface commune), vous pouvez ignorer complètement le dans ce cas, vous devez spécifier explicitement le type de concaténation), comme suit:

return FirstList.Concat<IInterface>(SecondList).ToList(); 
+1

Vous n'avez même pas besoin du' .Cast 'la deuxième fois. –

+1

Vous n'avez pas besoin de Cast du tout, vous pouvez simplement faire 'FirstList.Concat (SecondList) .ToList();' – Evk

+0

Correct, j'écrivais ceci pour un exemple plus générique, où il n'y avait pas de distribution implicite. – decPL