2009-06-25 125 views
117

如果我有:如何在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? 

我跑了類似下面的代碼在Visual Studio 2008,並在每次執行後設置斷點。在myList1 = getMeAList();之後,myList1包含四個字符串,然後我按下加號按鈕以確保它們不是全部空值。

myList2 = getMeAnotherList();,myList2之後包含六個字符串,我檢查以確保它們不爲空... myList1.Concat(myList2); myList1僅包含四個字符串。這是爲什麼?

+1

這是什麼用於斷點的公司嗎? – 2010-08-19 14:53:16

回答

66

試試這個:

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

Concat返回一個IEnumerable < T>是兩個列表放在一起,它不修改任何現有的列表。另外,因爲它返回一個IEnumerable,所以如果你想把它分配給一個名爲< T>的變量,你必須在返回的IEnumerable < T>上調用ToList()。

+4

現在我重新讀了這個問題,.AddRange()聽起來像OP真正想要的。 – 2009-06-25 04:47:02

8

Concat未更新myList1它返回包含連接的myList1myList2的新列表。

改爲使用 myList1.AddRange(myList2)

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

它工作正常我認爲是。如前所述,Concat返回一個新序列,並將結果轉換爲List,它完美地完成了這項工作。

2

還值得注意的是,Concat在恆定時間和恆定記憶中工作。 例如,下面的代碼

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

給出了下面的時間/內存指標:

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

我知道這是舊的,但我來到這個帖子迅速思考的毗連將是我的答案。 Union對我很好。請注意,它只返回唯一值,但知道我得到了獨特的值,無論如何這個解決方案爲我工作。

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

輸出是:

One 
Two 
Three 
1234 
4567 
1

採取看看我的實現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();