2017-10-10 2 views
1

In einer Klasse verarbeite ich eine Liste von IInterface.Zusammenführen von zwei Listen von Klassen, die dieselbe Schnittstelle implementieren

Ich möchte die beiden möglichen Implementierungen in einer separaten Art und Weise behandelt werden, daher:

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 
}; 

} 

Ich möchte eine List<IInterface>, gleich dem Eingang zurückzukehren, beide es stellt sich heraus, schwieriger zu sein als erwartet

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

compiles aber eine InvalidCastException zur Laufzeit,

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

kompiliert nicht ...

Was wäre der richtige Weg, dies zu tun?

+0

Ihr letztes Beispiel fast korrekt ist. Es fehlen Klammern und 'AddRange' hat den Rückgabetyp' void', so dass Sie es nicht verketten können: 'var ret = new Liste (); ret.AddRange (ErsteListe); ret.AddRange (Zweitliste); return ret; ' –

Antwort

7

Mit Linq:

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

Cast<> eines enumerable zurück (mind verzögerte Ausführung des Linq) mit Elementen in den Zieltyp gegossen, Concat kombiniert zwei enumerables und ToList das Ergebnis in eine Liste dreht (und materialisiert die Linq-Abfrage).

Wie @Evk freundlich bemerkt, wenn es eine implizite Umwandlung von beiden Typen zum Ausgabetyp gibt (wie in Ihrem Fall, können Sie beide Typen auf ihre gemeinsame Schnittstelle umwandeln), können Sie die Besetzung komplett überspringen (obwohl in dieser Fall müssen Sie explizit den Typen für Verkettung) angeben, wie folgt:

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

Sie brauchen nicht einmal das' .Cast 'das zweite Mal. –

+1

Sie brauchen überhaupt kein Cast, Sie können einfach 'FirstList.Concat (SecondList) .ToList();' – Evk

+0

Richtig, ich schrieb dies für ein allgemeineres Beispiel, wo es keine implizite Besetzung gab. – decPL

Verwandte Themen