2009-11-22 63 views

回答

3

怎麼樣(使用字典鍵作爲一個哈希表):

public static List<T> Union<T>(List<T> first, List<T> second) { 
    List<T> newList = new List<T>(first.Count + second.Count); 
    Dictionary<T, object> firstItems = new Dictionary<T, object>(first.Count); 

    foreach (T item in first) { 
     newList.Add(item); 
     firstItems.Add(item, null); 
    } 

    foreach (T item in second) { 
     if (!firstItems.ContainsKey(item)) { 
      newList.Add(item); 
     } 
    } 

    return newList; 
} 

這將保持在firstsecond項目訂單,同時還使用O(1)檢查列表之間重複的項目

+0

這裏的好主意,謝謝大家的貢獻! – larryq 2009-11-23 18:14:32

+0

請注意,這不會首先刪除dups – SwDevMan81 2009-11-23 18:35:16

3

你可以只添加它們一起刪除重複的:

public List<T> Union<T>(List<T> firstList, List<T> secondList) 
    { 
    Dictionary<T, int> tmp = new Dictionary<T, int>(); 

    foreach (T val in firstList) 
    { 
     tmp[val] = 1; 
    } 

    foreach (T val in secondList) 
    { 
     tmp[val] = 1; 
    } 

    return new List<T>(tmp.Keys); 
    } 
+1

使用字典可能會更改列表中元素的順序。 – 2009-11-22 02:25:49

+0

而且會改變firstList作爲操作的一個副作用 – thecoop 2009-11-23 11:47:29

+0

@CodeSavvyGeek兩個定義的聯合關聯和交換,順序無關緊要。 – SwDevMan81 2009-11-23 12:16:14

1

怎麼樣一個簡單的foreach,只增加已經不在列表中的元素:

foreach (int item in list2) 
{ 
    if (!list1.Contains(item)) 
    { 
     list1.Add(item); 
    } 
} 

這將保留列表的順序。

+1

如果列表很大,則包含可能會很慢。 – SwDevMan81 2009-11-22 01:56:50

1

你可以使用linqbridge,讓您使用LINQ到對象,同時還瞄準Framework 2.0中,如果您有Visual Studio 2008中

推,推,推移動到.NET 3.5。 LINQ和lambdas改變了你對代碼的看法(爲了更好,恕我直言)。

+0

我們的打包軟件還不能使用.NET 3.5,因爲有些人可能還沒有安裝它(認爲XP機器由BOFH運行) – thecoop 2009-11-23 11:48:48

相關問題