Як об'єднати два IEnumerable <T> у новий IEnumerable <T>?


201

У мене є два екземпляри IEnumerable<T>(з однаковим T). Я хочу, щоб новий екземпляр IEnumerable<T>- це об'єднання обох.

Чи є вбудований метод у .Net, щоб це зробити чи я повинен сам це написати?


9
Можливо, ви захочете зробити закладку code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b .
C-Pound Guru

Відповіді:


332

Так, 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

1
Я завжди забуваю шукати методи розширення, tx.
Самуель Россіль

10
@SamuelRossille Також не забувайте, що назви дій, які ви хочете виконати, ймовірно, близькі, якщо не точно називають те, що вам потрібно. Завжди переглядайте IntelliSense, ви багато чого дізнаєтесь.
Адам Холдсворт

3
Чи погано робити секунду = першу.Конкат (другий)? чи будуть у нас проблеми з одночасністю?
користувач2934433

4
@ user2934433: Ні, це абсолютно добре.
Джон Скіт

2
Просто швидка примітка. Потрібно імпортувати using System.Linq простір імен у верхній частині кодового файлу, щоб побачити потрібний метод розширення в intellisense IDE.
RBT

19

ConcatМетод повертає об'єкт , який реалізує IEnumerable<T>шляхом повернення об'єкта (назвемо його Cat) , чий Нумератор намагатиметься використовувати два передане перелічуваних елементів (назвемо їх А і В) в певній послідовності. Якщо перераховані перелічні числа представляють собою послідовності, які не змінюватимуться протягом життя Cat, і які можна прочитати без побічних ефектів, тоді Cat може використовуватися безпосередньо. В іншому випадку, це може бути ідея добре , щоб зателефонувати ToList()на Catі використовувати отриману List<T>(який буде представляти собою знімок вмісту А і В).

Деякі перелічувачі роблять знімок, коли починається перерахування, і повертають дані з цього знімка, якщо колекція буде змінена під час перерахування. Якщо В є такою чисельною, то будь-яка зміна B, яка відбудеться до того, як Кіт досяг кінця A, відобразиться в перерахунку Cat, але зміни, які відбудуться після цього, не будуть. Така семантика може бути заплутаною; Знімок Кота дозволяє уникнути подібних проблем.


7

Ви можете використовувати код нижче для свого рішення: -

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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.