У меня есть два экземпляра IEnumerable<T>
(с одинаковыми T
). Я хочу новый экземпляр, IEnumerable<T>
который является объединением обоих.
Есть ли встроенный метод в .Net, чтобы сделать это, или я должен написать это сам?
У меня есть два экземпляра IEnumerable<T>
(с одинаковыми T
). Я хочу новый экземпляр, IEnumerable<T>
который является объединением обоих.
Есть ли встроенный метод в .Net, чтобы сделать это, или я должен написать это сам?
Ответы:
Да, LINQ to Objects поддерживает это с Enumerable.Concat
:
var together = first.Concat(second);
NB: Если бы вы были first
или second
были нулем, вы бы получили ArgumentNullException
. Чтобы избежать этого и обрабатывать пустые значения как пустой набор, используйте оператор объединения нулей следующим образом:
var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type
using System.Linq
пространство имен в верхней части файла кода, чтобы увидеть нужный метод расширения в intellisense IDE.
Concat
Метод возвращает объект , который реализует IEnumerable<T>
путем возврата объекта (назовем его Cat) , чей перечислитель будет пытаться использовать два переданное перечислимых элементов (назовем их А и В) в определенной последовательности. Если переданные перечислимые числа представляют последовательности, которые не изменятся в течение срока службы Cat и могут быть прочитаны без побочных эффектов, тогда Cat может использоваться напрямую. В противном случае, это может быть идея хорошо , чтобы позвонить ToList()
на Cat
и использовать полученную List<T>
(который будет представлять собой снимок содержимого А и В).
Некоторые перечислимые снимки делают снимок при начале перечисления и возвращают данные из этого снимка, если коллекция изменена во время перечисления. Если B является таким перечислимым, то любое изменение в B, которое происходит до того, как Cat достигнет конца A, будет отображаться в перечислении Cat, но изменений, которые происходят после этого, не будет. Такая семантика, вероятно, может сбивать с толку; сделав снимок кошки, можно избежать подобных проблем.
Вы можете использовать код ниже для вашего решения: -
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);
}