У мене є два екземпляри IEnumerable<T>
(з однаковим T
). Я хочу, щоб новий екземпляр IEnumerable<T>
- це об'єднання обох.
Чи є вбудований метод у .Net, щоб це зробити чи я повинен сам це написати?
У мене є два екземпляри IEnumerable<T>
(з однаковим T
). Я хочу, щоб новий екземпляр IEnumerable<T>
- це об'єднання обох.
Чи є вбудований метод у .Net, щоб це зробити чи я повинен сам це написати?
Відповіді:
Так, LINQ to Objects підтримує це за допомогою Enumerable.Concat
:
var together = first.Concat(second);
Примітка: Якщо ви маєте бути first
чи second
недійсним, ви отримаєте ArgumentNullException
. Щоб уникнути цього і ставитись до нулей, як до порожнього набору, використовуйте оператор null coalescing так:
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, яка відбудеться до того, як Кіт досяг кінця 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);
}