Jak połączyć dwa IEnumerable <T> w nowy IEnumerable <T>?


201

Mam dwa wystąpienia IEnumerable<T>(z tym samym T). Chcę nowego wystąpienia, IEnumerable<T>który jest połączeniem obu.

Czy jest to metoda wbudowana w .Net, czy muszę to napisać sama?



Odpowiedzi:


332

Tak, LINQ to Objects obsługuje to z Enumerable.Concat:

var together = first.Concat(second);

NB: Powinna być firstlub secondbyć zerowa, otrzymasz ArgumentNullException. Aby tego uniknąć i traktować wartości zerowe jak puste, użyj operatora koalescencji zerowej w następujący sposób:

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

1
Zawsze zapominam szukać metod rozszerzenia, tx.
Samuel Rossille,

10
@SamuelRossille Nie zapominaj również, że nazwy działań, które chcesz wykonać, są prawdopodobnie bliskie, jeśli nie dokładnie nazywane tym, czego szukasz. Zawsze przeglądaj IntelliSense, dużo się uczysz.
Adam Houldsworth

3
Czy źle jest zrobić second = first.Concat (second)? czy będziemy mieć problemy z współbieżnością?
user2934433

4
@ user2934433: Nie, to absolutnie w porządku.
Jon Skeet

2
Krótka notatka. Wymagane jest zaimportowanie using System.Linq przestrzeni nazw na górze pliku kodu, aby zobaczyć pożądaną metodę rozszerzenia w inteligencji IDE.
RBT

19

ConcatSposób powraca do obiektu, który implementuje IEnumerable<T>powracając przedmiotów (połączyć go CAT), którego wyliczający spróbuje użyć przekazywana w przeliczalnych elementów (połączenie im i B), kolejno dwa. Jeśli przekazane wyliczenia reprezentują sekwencje, które nie zmienią się w trakcie życia Cat, i które można odczytać bez efektów ubocznych, Cat można użyć bezpośrednio. W przeciwnym razie może to być dobry pomysł, aby zadzwonić ToList()na Cati użyć wynikowy List<T>(który będzie reprezentował zrzut zawartości A i B).

Niektóre wyliczenia wykonują migawkę po rozpoczęciu wyliczania i zwracają dane z tej migawki, jeśli kolekcja zostanie zmodyfikowana podczas wyliczania. Jeśli B jest taką policzalną, to każda zmiana B, która nastąpi przed osiągnięciem przez kota końca A, pojawi się w wyliczeniu Cat, ale zmiany, które nastąpią później, nie będą. Taka semantyka może być myląca; wykonanie zdjęcia Cat może uniknąć takich problemów.


7

Możesz użyć poniższego kodu dla swojego rozwiązania: -

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

0
// The answer that 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);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.