it-swarm.com.de

Wie verkettet man zwei IEnumerable <T> zu einem neuen IEnumerable <T>?

Ich habe zwei Instanzen von IEnumerable<T> (mit demselben T). Ich möchte eine neue Instanz von IEnumerable<T> was die Verkettung von beiden ist.

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

166
Samuel Rossille

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

var together = first.Concat(second);

NB: Sollte first oder second null sein, erhalten Sie ein ArgumentNullException. Um dies zu vermeiden und Nullen wie eine leere Menge zu behandeln, verwenden Sie den Nullkoaleszenzoperator wie folgt:

var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type
281
Jon Skeet

Die Concat -Methode gibt ein Objekt zurück, das IEnumerable<T> Implementiert, indem ein Objekt zurückgegeben wird (nennen Sie es Cat), dessen Enumerator versucht, die beiden übergebenen aufzählbaren Elemente (nennen Sie sie A und B) in zu verwenden Sequenz. Wenn die übergebenen Enumerables 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() für Cat aufzurufen und das resultierende List<T> Zu verwenden (das eine Momentaufnahme des Inhalts von A und B darstellt).

Einige Enumerables erstellen zu Beginn der Enumeration einen Snapshot und geben Daten aus diesem Snapshot zurück, wenn die Auflistung während der Enumeration geändert wird. Wenn B eine solche Aufzählung ist, wird jede Änderung von B, die auftritt, bevor Cat das Ende von A erreicht hat, in der Aufzählung von Cat angezeigt, Änderungen, die danach vorgenommen werden, jedoch nicht. Eine solche Semantik kann wahrscheinlich verwirrend sein; Durch die Erstellung eines Schnappschusses von Cat können solche Probleme vermieden werden.

17
supercat

Sie können folgenden 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); 
    } 
}
7
Jay Shukla
//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);
}
0
Hasse