2009-06-25 16 views
117

Si tengo:¿Cómo concatenas las listas en C#?

List<string> myList1; 
List<string> myList2; 

myList1 = getMeAList(); 
// Checked myList1, it contains 4 strings 

myList2 = getMeAnotherList(); 
// Checked myList2, it contains 6 strings 

myList1.Concat(myList2); 
// Checked mylist1, it contains 4 strings... why? 

Me corrió un código similar a esto en Visual Studio 2008 y posicionar puntos de parada después de cada ejecución. Después de myList1 = getMeAList();, myList1 contiene cuatro cadenas, y presioné el botón más para asegurarme de que no fueran todas nulas.

Después myList2 = getMeAnotherList();, myList2 contiene seis cuerdas, y comprueba para asegurarse de que no eran nulas ... Después de myList1.Concat(myList2); myList1 contenía sólo cuatro cuerdas. ¿Porqué es eso?

+1

Que es esto utiliza para puntos de interrupción del negocio? –

Respuesta

66

Prueba esto:

myList1 = myList1.Concat(myList2).ToList(); 

Concat devuelve un IEnumerable < T> es decir, las dos listas juntas, que no modifica ninguna de las listas existentes. Además, como devuelve un IEnumerable, si desea asignarlo a una variable que es List < T>, tendrá que llamar a ToList() en IEnumerable < T> que se devuelve.

+4

Ahora que volví a leer la pregunta, .AddRange() suena como lo que el OP realmente quiere. –

+0

diciendo que el método concat tiene argumentos inválidos ... –

+0

@Kartiikeya si está diciendo que los argumentos son inválidos, no tiene una instrucción using para System.Linq, o uno de ellos no es un 'IEnumerable ' –

8

Concat no actualiza myList1 está devolviendo una nueva lista que contiene 0 concatenado myList1 y myList2.

Use myList1.AddRange(myList2) en su lugar.

4
targetList = list1.Concat(list2).ToList(); 

Está funcionando bien, creo que sí. Como se dijo anteriormente, Concat devuelve una nueva secuencia y, al convertir el resultado en Lista, hace el trabajo perfectamente.

2

También vale la pena señalar que Concat funciona en tiempo constante y en la memoria constante. Por ejemplo, el código siguiente

 long boundary = 60000000; 
     for (long i = 0; i < boundary; i++) 
     { 
      list1.Add(i); 
      list2.Add(i); 
     } 
     var listConcat = list1.Concat(list2); 
     var list = listConcat.ToList(); 
     list1.AddRange(list2); 

da las siguientes mediciones de tiempo/memoria:

After lists filled mem used: 1048730 KB 
concat two enumerables: 00:00:00.0023309 mem used: 1048730 KB 
convert concat to list: 00:00:03.7430633 mem used: 2097307 KB 
list1.AddRange(list2) : 00:00:00.8439870 mem used: 2621595 KB 
1

Sé que esto es viejo, pero me encontré con este post pensando rápidamente de concatenación sería mi respuesta. Union funcionó muy bien para mí. Tenga en cuenta que solo devuelve valores únicos, pero sabiendo que obtuve valores únicos de todos modos, esta solución funcionó para mí.

namespace TestProject 
{ 
    public partial class Form1 :Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      List<string> FirstList = new List<string>(); 
      FirstList.Add("1234"); 
      FirstList.Add("4567"); 

      // In my code, I know I would not have this here but I put it in as a demonstration that it will not be in the secondList twice 
      FirstList.Add("Three"); 

      List<string> secondList = GetList(FirstList);    
      foreach (string item in secondList) 
       Console.WriteLine(item); 
     } 

     private List<String> GetList(List<string> SortBy) 
     { 
      List<string> list = new List<string>(); 
      list.Add("One"); 
      list.Add("Two"); 
      list.Add("Three"); 

      list = list.Union(SortBy).ToList(); 

      return list; 
     } 
    } 
} 

La salida es:

One 
Two 
Three 
1234 
4567 
1

toma vistazo a mi aplicación its safe from null lists

IList<string> all= new List<string>(); 

      if (letterForm.SecretaryPhone!=null)// first list may be null 
       all=all.Concat(letterForm.SecretaryPhone).ToList(); 

      if (letterForm.EmployeePhone != null)// second list may be null 
       all= all.Concat(letterForm.EmployeePhone).ToList(); 

      if (letterForm.DepartmentManagerName != null) // this is not list (its just string variable) so wrap it inside list then concat it 
       all = all.Concat(new []{letterForm.DepartmentManagerPhone}).ToList(); 
Cuestiones relacionadas