2013-01-04 17 views
114

Mam dwa wystąpienia IEnumerable<T> (z tym samym T). Chcę nowej instancji IEnumerable<T>, która jest połączeniem obu.Jak połączyć dwa IEnumerable <T> w nowy IEnumerable <T>?

Czy istnieje metoda wbudowana w .Net, aby to zrobić, czy muszę sam to napisać?

+9

Możesz chcieć dodać do zakładek http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b. –

+0

powiązane, jeśli pomaga: [elegancki sposób łączenia wielu kolekcji elementów?] (Http://stackoverflow.com/questions/4493858/elegant-way-to-combine-multiple-collections-of-elements) – nawfal

Odpowiedz

189

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

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

Zawsze zapomnij o wyszukiwaniu metod rozszerzeń, tx. –

+9

@SamuelRossille Pamiętaj też, że nazwy czynności, które chcesz wykonać, są prawdopodobnie blisko, jeśli nie są dokładnie nazywane, co chcesz. Zawsze przeglądaj IntelliSense, wiele się nauczysz. –

+2

Czy to źle, aby zrobić drugie = first.Concat (drugi)? czy będziemy mieć problemy z współbieżnością? – user2934433

4

Możesz skorzystać z poniższego kodu do 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); 
    } 
} 
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

Sposób Concat zwróci obiekt, który implementuje IEnumerable<T> poprzez zwrócenie obiektu (wywołanie go Cat), którego moduł wyliczający spróbuje użyć dwóch przekazywanych elementów przeliczalnych (wywołaj je kolejno A i B). Jeśli przekazane liczby wyliczane reprezentują sekwencje, które nie ulegną zmianie w trakcie życia kota, i które można odczytać bez efektów ubocznych, wówczas Cat może być użyty bezpośrednio. W przeciwnym razie może być dobrym pomysłem wywołanie ToList() na Cat i użycie wynikowej List<T> (która będzie stanowić migawkę zawartości A i B).

Niektóre wyliczenia pobierają migawkę, gdy rozpoczyna się wyliczanie, i zwrócą dane z tej migawki, jeśli kolekcja zostanie zmodyfikowana podczas wyliczenia. Jeśli B jest tak wyliczalny, to każda zmiana w B, która nastąpi przed osiągnięciem przez Cat wartości A, pojawi się w wyliczeniu Cat, ale zmiany, które nastąpią po tym, nie będą. Taka semantyka może być myląca; zrobienie migawki kota może uniknąć takich problemów.

Powiązane problemy