2009-06-25 10 views
117

Si j'ai:Comment concaténer les listes 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? 

j'ai couru un code similaire à ce points de rupture Visual Studio 2008 et mis après chaque exécution. Après myList1 = getMeAList();, myList1 contient quatre chaînes, et j'ai appuyé sur le bouton plus pour s'assurer qu'ils n'étaient pas tous null.

Après myList2 = getMeAnotherList();, myList2 contient six chaînes, et j'ai vérifié pour s'assurer qu'ils n'étaient pas nuls ... Après myList1.Concat(myList2); myList1 contenait seulement quatre chaînes. Pourquoi donc?

+1

Qu'est-ce que cette occasion pour les entreprises de points d'arrêt? –

Répondre

66

Essayez ceci:

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

Concat retourne un < T> IEnumerable qui est les deux listes mis ensemble, il ne modifie pas non plus la liste existante. En outre, comme il retourne un IEnumerable, si vous voulez l'assigner à une variable qui est List < T>, vous devrez appeler ToList() sur le IEnumerable < T> qui est retourné.

+4

Maintenant que j'ai relu la question, .AddRange() ressemble à ce que l'OP veut vraiment. –

+0

disant que la méthode concat a des arguments invalides ... –

+0

@Kartiikeya si elle dit que les arguments ne sont pas valides, vous n'avez pas d'instruction using pour System.Linq, ou l'un d'entre eux n'est pas un 'IEnumerable ' –

8

Concat ne met pas à jour myList1 il retourne une nouvelle liste contenant les myList1 concaténés et myList2. À la place, utilisez myList1.AddRange(myList2).

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

Cela fonctionne très bien, je pense. Comme dit précédemment, Concat retourne une nouvelle séquence et tout en convertissant le résultat en List, il fait parfaitement le travail.

2

Il convient également de noter que Concat fonctionne à temps constant et en mémoire constante. Par exemple, le code suivant

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

donne les paramètres temps/mémoire suivants:

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

Je sais que c'est vieux, mais je suis tombé sur ce poste pensant rapidement Concat serait ma réponse. Union a très bien fonctionné pour moi. Notez qu'il ne renvoie que des valeurs uniques, mais sachant que je recevais des valeurs uniques, cette solution a fonctionné pour moi.

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 sortie est:

One 
Two 
Three 
1234 
4567 
1

look prendre à ma mise en œuvre 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(); 
Questions connexes