2012-04-16 107 views
3

什麼是採取列表2並將其添加到列表1結束一個簡單有效的方法 - 但只有那些項目是已經列表1方式在連接之前 - 將被添加到它?C#:連接兩個列表不重複

編輯: 我一直在嘗試方法建議在這裏的答案,但我仍然得到愚蠢添加到List1!
這是一個代碼示例:

// Assume the existence of a class definition for 'TheObject' which contains some 
// strings and some numbers. 

string[] keywords = {"another", "another", "another"}; 
List<TheObject> tempList = new List<TheObject>(); 
List<TheObject> globalList = new List<TheObject>(); 

foreach (string keyword in keywords) 
{ 
    tempList = // code that returns a list of relevant TheObject(s) according to 
       // this iteration's keyword. 
    globalList = globalList.Union<TheObject>(tempList).ToList(); 
} 

當調試 - 在第二次迭代之後 - globalList包含TheObject的完全相同的對象的兩個副本。同樣的事情也發生了,當我嘗試實施愛德華·佈雷的解決方案......

EDIT2:
我修改,返回一個新tempList的代碼,同時檢查是否返回的項目已經在globalList(由正在做!globalList.contains()) - 它現在起作用。
雖然,這是一個變通......

+0

確實TheObject具有的Equals重寫?否則,默認值是引用相等,如果每次新創建tempList的項目,這將不起作用。 – 2012-04-16 05:17:38

+0

這是一個由Linq自動生成的從數據庫表中的SQL的類。我查看了定義,並沒有看到任何Equals覆蓋。我應該創建一個嗎?一個需要兩個對象實例並比較它們的每個屬性? – 2012-04-16 05:27:01

+0

或者我可以以某種方式將'通過引用平等'的默認值更改爲'按值'? – 2012-04-16 05:29:13

回答

4

List1.Union(列表2)。對於更多的例子轉到http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

+0

我試過了: List1 = List1.Union(List2).toList();在每次迭代中List2不同的循環中 - 已經在List1中的項目仍然被添加到它... – 2012-04-16 04:51:07

+1

這是奇怪的。嘗試List1 = List1.Union(List2).Distinct() – 2012-04-16 05:14:38

2

您可以使用List的聯盟方法類似

List1.Union(list2); 
1

LINQ的Union如果List1的所有項目都是不同的,那麼它們將工作。否則,以更精確地滿足既定目標,而不需要O(m * n個)搜索時,你可以使用一個哈希集合(用列表的類型更換T):

var intersection = new HashSet<T>(List1.Intersect(List2)); 
List1.AddRange(List2.Where(item => !intersection.Contains(item)));