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?
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:
Sí, LINQ to Objects admite esto con Enumerable.Concat
:
var together = first.Concat(second);
NB: Debería ser nulo first
o second
recibirí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
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.
El Concat
mé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 Cat
y 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.
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);
}
}
// 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);
}