我需要从元组列表中查找并删除重复项。 基本上,我的结构是这样的:
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 ?
}
我不能使用词典,因为我可以使用相同的键但值不同! 提前谢谢
答案 0 :(得分:23)
答案 1 :(得分: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());
或者没有你自己的比较器:
var hashSet = HashSet<Tuple<string, string>>(list);
现在您可以向hashSet添加元素,并且所有元素都是唯一的。完成添加元素后,您可以将其再次转换为列表:
var uniquedList = hashSet.ToList();
或者只使用list.Distinct().ToList()
答案 2 :(得分:0)
使用distinct()
方法:
myList.Distinct().ToList();
答案 3 :(得分: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是为了便于阅读。