Как объединить два IEnumerable в новый IEnumerable?


у меня есть два экземпляра IEnumerable<T> (с тем же T). Я хочу новый экземпляр IEnumerable<T>, который является конкатенацией обоих.

есть ли встроенный метод в .Net, чтобы сделать это, или я должен написать его сам?

4 135

4 ответа:

да, LINQ to Objects поддерживает это с помощью Enumerable.Concat:

var together = first.Concat(second);

The Concat метод вернет объект, который реализует IEnumerable<T> возвращая объект (назовите его Cat), перечислитель которого попытается использовать два переданных перечислимых элемента (назовите их A и B) последовательно. Если переданные перечислимые элементы представляют собой последовательности, которые не изменятся в течение жизни Cat и которые могут быть прочитаны без побочных эффектов, то Cat может использоваться непосредственно. В противном случае, это может быть хорошей идеей, чтобы позвонить ToList() on Cat и использовать полученный List<T> (который будет представлять собой снимок содержимого A и B).

некоторые перечислители делают снимок при начале перечисления и возвращают данные из этого снимка, если коллекция изменяется во время перечисления. Если 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 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);
}