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


201

Tengo dos instancias de IEnumerable<T>(con lo mismo T). Quiero una nueva instancia de la IEnumerable<T>cual es la concatenación de ambos.

¿Hay un método incorporado en .Net para hacer eso o tengo que escribirlo yo mismo?



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

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.


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); 
    } 
}

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);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.