2009-06-25 8 views
117

Wenn ich habe:Wie verketten Sie Listen in 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? 

Ich lief Code ähnlich wie diese in Visual Studio 2008 und stellen Sollbruchstellen nach jeder Ausführung. Nach myList1 = getMeAList();, myList1 enthält vier Strings, und ich drückte auf die Plus-Taste, um sicherzustellen, dass sie nicht alle Nullen waren.

Nach myList2 = getMeAnotherList(); enthält myList2 sechs Saiten, und ich überprüft, um sicherzustellen, dass sie nicht null waren ... Nach myList1.Concat(myList2); mylist1 nur vier Saiten enthalten. Warum das?

+1

Was dies für Breakpoints Unternehmen verwendet? –

Antwort

66

Try this:

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

Concat gibt eine IEnumerable < T>, die die beiden Listen zusammengestellt ist, wird es auch nicht vorhandene Liste ändern. Da ein IEnumerable zurückgegeben wird, müssen Sie ToList() auf dem IEnumerable < T>, das zurückgegeben wird, aufrufen, wenn Sie es einer Variablen zuweisen möchten, die List < T> ist.

+4

Jetzt, nachdem ich die Frage erneut gelesen habe, klingt .AddRange() wie das, was das OP wirklich will. –

+0

Sprichwort concat Methode hat ungültige Argumente ... –

+0

@Kartiikeya wenn es sagt, dass die Argumente ungültig sind, haben Sie keine using Aussage für System.Linq, oder eine von ihnen ist nicht ein 'IEnumerable ' –

8

Concat aktualisiert nicht myList1 Es gibt eine neue Liste mit den verketteten myList1 und myList2 zurück.

Verwenden Sie stattdessen myList1.AddRange(myList2).

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

Es funktioniert gut, denke ich. Wie bereits erwähnt, gibt Concat eine neue Sequenz zurück, und während das Ergebnis in List konvertiert wird, erledigt es die Aufgabe perfekt.

2

Es ist auch erwähnenswert, dass Concat in konstanter Zeit und in konstantem Speicher arbeitet. Zum Beispiel der folgende Code

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

gibt folgenden zeitlichen/Speichermetriken:

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

Ich weiß, das ist alt, aber ich kam schnell auf diesem Beitrag dachte Concat meine Antwort wäre. Union hat super für mich gearbeitet. Beachten Sie, dass es nur eindeutige Werte zurückgibt, aber da ich wusste, dass ich eindeutige Werte erhielt, funktionierte diese Lösung für mich.

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

Die Ausgabe lautet:

One 
Two 
Three 
1234 
4567 
1

nehmen Blick auf meine Implementierung 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();