2013-06-24 49 views
17

我需要從元組列表中找到並刪除重複項。 基本上,我的結構是由這樣的:查找並刪除C#中的元組列表中的重複項

List<Tuple<string, string>> myList = new List<Tuple<string, string>>(); 

**** 

private void FillStructure() 
{ 
    myList.Add(Tuple.Create<string, string>("A", "B")); 
    myList.Add(Tuple.Create<string, string>("A", "C")); 
    myList.Add(Tuple.Create<string, string>("C", "B")); 
    myList.Add(Tuple.Create<string, string>("C", "B")); // Duplicate 
    myList.Add(Tuple.Create<string, string>("A", "D")); 

    FindAndRemoveDuplicates(myList); 
} 

private void FindAndRemoveDuplicates(List<Tuple<string, string>> myList) 
{ 
     // how can I perform this ? 
} 

我不能使用字典,因爲我可以有相同的密鑰,但不同的值! 預先感謝您

回答

19

您可以使用LINQ的Distinct()方法,像這樣:

myList = myList.Distinct().ToList(); 

注意,這將重新創建列表,而不是代替刪除重複項。

+0

的解決方案是如此簡單!謝謝! :) – davideberdin

0

使用distinct()方法:

myList.Distinct().ToList(); 
0

如果希望修訂到位列表中的解決方案,你可以使用一個HashSet<T>的(或舊的框架方面Dictionary<Tuple<string, string>, object>並忽略值):

var existing = new HashSet<Tuple<string, string>>(); 

for (int i = myList.Count - 1; i >= 0; i--) 
{ 
    if (existing.Contains(myList[i])) 
    { 
     myList.RemoveAt(i); 
    } 
    else 
    { 
     existing.Add(myList[i]); 
    } 
} 

我們在不使用迭代器的情況下向後計數(否則在迭代時會出現錯誤修改列表的錯誤)。

HashSet<T>也有覆蓋平等,如果您需要它的過載。

個人而言,我會去dasblinkenlight's answer的可讀性。

6

您可以使用HashSet的這個目的(http://msdn.microsoft.com/en-us/library/bb359438.aspx

class SameTuplesComparer<T1, T2> : EqualityComparer<Tuple<T1, T2>> 
{ 
    public override bool Equals(Tuple<T1, T2> t1, Tuple<T1, T2> t2) 
    { 
     return t1.Item1.Equals(t2.Item1) && t1.Item2.Equals(t2.Item2) 
    } 


    public override int GetHashCode(Tuple<T1, T2> t) 
    { 
    return base.GetHashCode(); 
    } 
} 

所以,如果你寫你自己的比較器,你可以有點不同比較字符串(如例子中,沒有casesensetive):

class SameStringTuplesComparer: EqualityComparer<Tuple<string, string>> 
{ 
    public override bool Equals(Tuple<string, string> t1, Tuple<string, string> t2) 
    { 
     return t1.Item1.Equals(t2.Item1, StringComparison.CurrentCultureIgnoreCase) && t1.Item2.Equals(t2.Item2, StringComparison.CurrentCultureIgnoreCase) 
    } 


    public override int GetHashCode(Tuple<string, string> t) 
    { 
    return base.GetHashCode(); 
    } 
} 

然後在代碼:

var hashSet = new HashSet<Tuple<string, string>>(list, new SameTuplesComparer()); 

或沒有你自己的比較r:

var hashSet = HashSet<Tuple<string, string>>(list); 

現在您可以將元素添加到hashSet,並且所有元素都將是唯一的。在您用添加元素做,你可以將其轉換再次列出:

var uniquedList = hashSet.ToList(); 

或者只是使用list.Distinct().ToList()

+0

請注意,在這種情況下您最終會遇到'HashSet '而不是'List '。另外一個'Tuple '不需要提供比較器。 –

+0

答案已編輯,謝謝 –

+0

+1對於額外的選擇。 –