¿Es posible convertir dos o más listas en una sola lista, en .NET usando C #?
Por ejemplo,
public static List<Product> GetAllProducts(int categoryId){ .... }
.
.
.
var productCollection1 = GetAllProducts(CategoryId1);
var productCollection2 = GetAllProducts(CategoryId2);
var productCollection3 = GetAllProducts(CategoryId3);
AddRange
método?Respuestas:
Puede usar el LINQ
Concat
y losToList
métodos:Tenga en cuenta que hay formas más eficientes de hacer esto: lo anterior básicamente recorrerá todas las entradas, creando un búfer de tamaño dinámico. Como puede predecir el tamaño para comenzar, no necesita este tamaño dinámico ... por lo que podría usar:
(
AddRange
está especialmente revestidoICollection<T>
para mayor eficiencia).Sin embargo, no tomaría este enfoque a menos que realmente tenga que hacerlo.
fuente
productCollection1.ForEach(p => allProducts.Add(p))
es más eficiente que AddRange.AddRange
se puede hacer una copia en bloque de una matriz subyacente a otra. ¿Tienes algún enlace para evidencia de esto?productionCollection1.ForEach(...)
es más eficiente que AddRange". El rendimiento rara vez se describe tan fácilmente. Yo estoy sorprendido de que AddRange no late que cómodamente sin embargo - que necesito para investigar que más.AddRange
es la mejor opción para la velocidad bruta (aproximadamente 4x y cuanto más grandes sean las listas, mejor será el aumento), como Jon sugerirSuponiendo que desea una lista que contenga todos los productos para los ID de categoría especificados, puede tratar su consulta como una proyección seguida de una operación de aplanamiento . Hay un operador de LINQ que hace eso:
SelectMany
.En C # 4, puede acortar SelectMany a:
.SelectMany(GetAllProducts)
Si ya tiene listas que representan los productos para cada Id, entonces lo que necesita es una concatenación , como otros señalan.
fuente
puedes combinarlos usando LINQ:
Sin
List.AddRange()
embargo, el enfoque más tradicional del uso podría ser más eficiente.fuente
Eche un vistazo a List.AddRange para fusionar Listas
fuente
Puede usar el método de extensión Concat :
fuente
fuente
Sé que esta es una vieja pregunta que pensé que podría agregar mis 2 centavos.
Si tienes un
List<Something>[]
puedes unirte a ellos usandoAggregate
Espero que esto ayude.
fuente
Ya lo he comentado, pero sigo pensando que es una opción válida, solo pruebe si en su entorno es mejor una solución u otra. En mi caso particular, el uso
source.ForEach(p => dest.Add(p))
funciona mejor que el clásico,AddRange
pero no he investigado por qué en el nivel bajo.Puede ver un código de ejemplo aquí: https://gist.github.com/mcliment/4690433
Entonces la opción sería:
Pruébalo para ver si te funciona.
Descargo de responsabilidad : no estoy abogando por esta solución, encuentro
Concat
la más clara. Simplemente dije, en mi discusión con Jon, que en mi máquina este caso funciona mejor queAddRange
, pero él dice, con mucho más conocimiento que yo, que esto no tiene sentido. Ahí está la esencia si quieres comparar.fuente
var allProducts = lstName.Concat(lstCMSID) .Concat(lstSpecialtyPhys) .ToList();
que lo agrega a GridView pero como una columna. Me gustaría dividirlos en tres columnas separadas.De esta manera, es una Lista multidimensional y .SelectMany () lo aplanará en un IEnumerable de producto y luego usaré el método .ToList () después.
fuente
Para fusionar o combinar a listas en una lista de One.
Hay una cosa que debe ser cierta: el tipo de ambas listas será igual.
Por ejemplo : si tenemos una lista de
string
modo que podamos agregar, agregue otra lista a la lista existente que tenga una lista de tipo cadena; de lo contrario, no podemos.Ejemplo :
fuente
En el caso especial: "Todos los elementos de la Lista1 van a una nueva Lista2": (por ejemplo, una lista de cadenas)
En este caso, list2 se genera con todos los elementos de list1.
fuente
Necesita usar la operación Concat
fuente
Cuando tienes pocas listas pero no sabes cuántas exactamente, usa esto:
listsOfProducts
contiene pocas listas llenas de objetos.fuente