在C#中查找和删除元组列表中的重复项

我需要从元组列表中查找并删除重复项。 基本上,我的结构是这样的:

List<Tuple> myList = new List<Tuple>(); **** private void FillStructure() { myList.Add(Tuple.Create("A", "B")); myList.Add(Tuple.Create("A", "C")); myList.Add(Tuple.Create("C", "B")); myList.Add(Tuple.Create("C", "B")); // Duplicate myList.Add(Tuple.Create("A", "D")); FindAndRemoveDuplicates(myList); } private void FindAndRemoveDuplicates(List<Tuple> myList) { // how can I perform this ? } 

我不能使用词典,因为我可以拥有相同的键但不同的值! 先感谢您

您可以使用LINQ的Distinct()方法,如下所示:

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

请注意,这将重新创建列表,而不是删除重复项。

您可以使用HashSet来实现此目的( http://msdn.microsoft.com/en-us/library/bb359438.aspx

 class SameTuplesComparer : EqualityComparer> { public override bool Equals(Tuple t1, Tuple t2) { return t1.Item1.Equals(t2.Item1) && t1.Item2.Equals(t2.Item2) } public override int GetHashCode(Tuple t) { return base.GetHashCode(); } } 

因此,如果您编写自己的比较器,则可以稍微不同地比较字符串(例如,不是casesensetive):

 class SameStringTuplesComparer: EqualityComparer> { public override bool Equals(Tuple t1, Tuple t2) { return t1.Item1.Equals(t2.Item1, StringComparison.CurrentCultureIgnoreCase) && t1.Item2.Equals(t2.Item2, StringComparison.CurrentCultureIgnoreCase) } public override int GetHashCode(Tuple t) { return base.GetHashCode(); } } 

然后在代码中:

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

或者没有你自己的比较器:

 var hashSet = HashSet>(list); 

现在,您可以向hashSet添加元素,并且所有元素都是唯一的。 完成添加元素后,您可以再次将其转换为列表:

 var uniquedList = hashSet.ToList(); 

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

使用distinct()方法:

 myList.Distinct().ToList(); 

如果你想要一个修改列表的解决方案,你可以使用HashSet (或者对于旧框架使用Dictionary, object>并忽略该值):

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

我们在不使用迭代器的情况下向后计数(否则在迭代时会出现修改列表的错误)。

如果需要, HashSet还具有重载相等的重载。

就个人而言,我会选择dasblinkenlight的可读性答案 。