2013-01-04 15 views
114

Ich habe zwei Instanzen von IEnumerable<T> (mit dem gleichen T). Ich möchte eine neue Instanz von IEnumerable<T>, die die Verkettung von beiden ist.Wie verkette ich zwei IEnumerable <T> in einem neuen IEnumerable <T>?

Gibt es eine eingebaute Methode in .Net, um das zu tun, oder muss ich es selbst schreiben?

+9

Sie könnten http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b als Lesezeichen speichern. –

+0

verwandt, wenn es hilft: [Elegante Möglichkeit, mehrere Sammlungen von Elementen zu kombinieren?] (Http://stackoverflow.com/questions/4493858/elegant-way-to-combine-multiple-collection-of-elements) – nawfal

Antwort

189

Ja, LINQ to Objects unterstützt dies mit Enumerable.Concat:

var together = first.Concat(second); 
+0

Ich immer Vergessen Sie das Nachschlagen von Erweiterungsmethoden, tx. –

+9

@SamuelRossille Vergessen Sie auch nicht, dass die Namen von Aktionen, die Sie ausführen möchten, in der Nähe sind, wenn Sie nicht genau das nennen, was Sie suchen. Durchsuchen Sie immer IntelliSense, Sie lernen viel. –

+2

Ist es schlecht, zweite = erste.Concat (zweite) zu tun? werden wir Nebenläufigkeitsprobleme haben? – user2934433

4

Sie unter Code für Ihre Lösung verwenden: -

public void Linq94() 
{ 
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 
    int[] numbersB = { 1, 3, 5, 7, 8 }; 

    var allNumbers = numbersA.Concat(numbersB); 

    Console.WriteLine("All numbers from both arrays:"); 
    foreach (var n in allNumbers) 
    { 
     Console.WriteLine(n); 
    } 
} 
2
//The answare i was looking for when searching 
public void Answer() 
{ 
    IEnumerable<YourClass> first = this.GetFirstIEnumerableList(); 
    //Assign to empty list so we can use later 
    IEnumerable<YourClass> second = new List<YourClass>(); 

    if (IwantToUseSecondList) 
    { 
     second = this.GetSecondIEnumerableList(); 
    } 
    IEnumerable<SchemapassgruppData> concatedList = first.Concat(second); 
} 
12

Die Concat Methode wird ein Objekt, das Gerät zurückgeben IEnumerable<T> indem Sie ein Objekt zurückgeben (nennen Sie es Cat), dessen Enumerator versuchen wird, die beiden übergebenen aufzählbaren Elemente (nennen Sie sie A und B) nacheinander zu verwenden. Wenn die übergebenen Aufzählungen Sequenzen darstellen, die sich während der Lebensdauer von Cat nicht ändern und die ohne Nebenwirkungen gelesen werden können, kann Cat direkt verwendet werden. Andernfalls ist es möglicherweise eine gute Idee, ToList() unter Cat anzurufen und das Ergebnis List<T> zu verwenden (das eine Momentaufnahme des Inhalts von A und B darstellt).

Einige Enumerables nehmen einen Snapshot auf, wenn die Enumeration beginnt, und geben Daten aus diesem Snapshot zurück, wenn die Auflistung während der Enumeration geändert wird. Wenn B so aufzählbar ist, dann wird jede Änderung von B, die auftritt, bevor Cat das Ende von A erreicht hat, in Cat's Enumeration auftauchen, aber Änderungen, die danach auftreten, werden dies nicht tun. Eine solche Semantik kann wahrscheinlich verwirrend sein; Einen Schnappschuss von Cat zu machen kann solche Probleme vermeiden.

Verwandte Themen