2012-03-01 8 views
14

Aquí hay un código de ejemplo:¿Hay una manera fácil de agregar un IList <MyType> a otro?

IList<MyType> myList1=new List<MyType>(); 
IList<MyType> myList2=new List<MyType>(); 

// Populate myList1 
... 
// Add contents of myList1 to myList2 
myList2.Add(myList1); // Does not compile 

¿Cómo puedo añadir el contenido de una lista a otra - ¿existe un método para esto?

+0

'targetList.AddRange (sourceList);' – vulkanino

+1

@vulkanino 'AddRange' es un método de' List <> ', no' IList <> '. – phoog

+0

sí, lo siento, quise decir un elenco que no especifiqué. – vulkanino

Respuesta

24

No hay una gran manera incorporada de hacerlo. Realmente lo que quiere es un método AddRange, pero no existe en el IList<T> (ni en su jerarquía). La definición de un nuevo método de extensión aunque para esto es sencillo

public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> enumerable) { 
    foreach (var cur in enumerable) { 
    collection.Add(cur); 
    } 
} 

myList2.AddRange(myList1); 
+0

@downvoter cuidado de explicar? – JaredPar

+0

Soy un defensor, no un infractor, pero podría ser porque "es excesivo declarar un método para una tarea tan simple". Recibí críticas similares por una respuesta mía; el método fue tal vez 5 o 6 líneas de código, que salvó solo un par de líneas de código en el sitio de llamadas. Pero el sitio de llamada se cambió a una única expresión en lugar de a 2 o 3 instrucciones, y, por supuesto, si el método se usa más de una vez, hay una disminución neta en las líneas de código. – phoog

+0

@phoog Sí, si lo estuviera usando solo una vez, simplemente alinearía el 'foreach'. Sin embargo, este es uno de los métodos de extensión estándar (como 'ForEach') que acabo de definir en cada proyecto que escribo. Son increíblemente útiles. – JaredPar

0

Si el tipo de tiempo de ejecución de la segunda lista es List<T>, puede convertir a ese tipo y usar el método AddRange().

De lo contrario, tiene que hacerlo usted mismo con un bucle. Alternativamente, puede usar linq para crear una nueva lista que contenga los contenidos de ambas listas fuente.

10

Si se declara ambos tipos de listas como el hormigón List en lugar de IList, puede utilizar la AddRange método:

List<MyType> myList1=new List<MyType>(); 
List<MyType> myList2=new List<MyType>(); 

myList2.AddRange(myList1); 

de lo contrario se podría utilizar LINQ para combinar los dos:

using System.Linq; 

IList<MyType> myList1=new List<MyType>(); 
IList<MyType> myList2=new List<MyType>(); 

var newList = myList1.Concat(myList2); 
+1

Aunque la solución LINQ se ve bien en el momento de la llamada, tiene la ineficacia de hacer una nueva lista con los elementos combinados. –

+0

Michael, cualquier forma tiene pros y contras (: –

11
extensión

uso Enumerablr,

myList2=new List<MyType>(myList2.Concat(myList1)) 

Por cierto, si no se rellena myList2, sólo puede crearlo basa en myLis1.

EDITAR

he tratar de perfomance de la investigación de varios casos

1) AddRange través Añadir

List2.AddRange(List1); 

public static class AddRangeUtils 
{ 
    public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> enumerable) 
    { 
     foreach (var cur in enumerable) 
     { 
      collection.Add(cur); 
     } 
    } 
} 

2) de concatenación

List2 = new List<TestClass>(List2.Concat(List1)) 

3) predefinidas Colección Count 1

var thirdList = new List<TestClass>(List2.Count + List1.Count); 
foreach (var testClass in List1) 
{ 
    thirdList.Add(testClass); 
} 
foreach (var testClass in List2) 
{ 
    thirdList.Add(testClass); 
} 
List2 = thirdList; 

4) predefinidas Colección Conde Conde 2

var thirdList = new List<TestClass>(List2.Count + List1.Count); 
thirdList.AddRange(List1); 
thirdList.AddRange(List2); 
List2 = thirdList; 

de la colección es el número de elementos de cada lista, Lista1 y Lista2: y llegó a tales resultados (con diferente longitud de colección)

results for calculation

+1

Sin embargo, esto no agrega el valor a 'myList2'. En su lugar crea un nuevo valor' List '.Esto es diferente de lo que el OP está pidiendo. – JaredPar

+0

Of cource , tiene que asignarlo a myList. Ok, he modificado –

+2

Esto tiene una complejidad de tiempo horrible si se añaden varias listas. –

Cuestiones relacionadas