¿Cómo concatenar dos IEnumerable <T> en un nuevo IEnumerable <T>?

Respuestas:

332

Sí, LINQ to Objects admite esto con Enumerable.Concat:

var together = first.Concat(second);

NB: Debería ser nulo firsto secondrecibiría unArgumentNullException . Para evitar esto y tratar los nulos como lo haría con un conjunto vacío, use el operador de fusión nulo de la siguiente manera:

var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type
Jon Skeet
fuente
1
Siempre olvido buscar métodos de extensión, tx.
Samuel Rossille
10
@SamuelRossille Además, no olvide que los nombres de las acciones que desea realizar probablemente estén cerca si no se llaman exactamente lo que está buscando. Siempre navega por IntelliSense, aprendes mucho.
Adam Houldsworth
3
¿Es malo hacer second = first.Concat (second)? tendremos problemas de concurrencia?
user2934433
44
@ user2934433: No, eso está absolutamente bien.
Jon Skeet
2
Solo una nota rapida. Es necesario importar el using System.Linq espacio de nombres en la parte superior del archivo de código para ver el método de extensión deseado en el IDE intellisense.
RBT
19

El Concatmétodo devolverá un objeto que se implementa IEnumerable<T>devolviendo un objeto (llámelo Cat) cuyo enumerador intentará usar los dos elementos enumerables pasados ​​(llámelos A y B) en secuencia. Si los enumerables pasados ​​representan secuencias que no cambiarán durante la vida útil de Cat, y que se pueden leer sin efectos secundarios, entonces Cat se puede usar directamente. De lo contrario, puede ser una buena idea para llamar ToList()en Caty utilizar el resultado List<T>(que representará una instantánea del contenido de A y B).

Algunos enumerables toman una instantánea cuando comienza la enumeración y devolverán datos de esa instantánea si la colección se modifica durante la enumeración. Si B es tan enumerable, cualquier cambio en B que ocurra antes de que Cat haya llegado al final de A aparecerá en la enumeración de Cat, pero los cambios que ocurran después de eso no lo harán. Tal semántica puede ser confusa; Tomar una instantánea de Cat puede evitar tales problemas.

Super gato
fuente
7

Puede usar el siguiente código para su solución: -

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); 
    } 
}
Jay Shukla
fuente
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);
}
Hasse
fuente