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?
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:
Tak, LINQ to Objects obsługuje to z Enumerable.Concat
:
var together = first.Concat(second);
NB: Powinna być first
lub second
być 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
using System.Linq
przestrzeni nazw na górze pliku kodu, aby zobaczyć pożądaną metodę rozszerzenia w inteligencji IDE.
Concat
Sposó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 Cat
i 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.
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);
}
}
// 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);
}