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

spa*_*unk 22 c# tuples list

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

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 ?
}
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 25

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

myList = myList.Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

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


Vik*_*ova 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();
   }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果你编写自己的比较器,你可以稍微不同地比较字符串(例如,不是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();
   }
}
Run Code Online (Sandbox Code Playgroud)

然后在代码中:

var hashSet = new HashSet<Tuple<string, string>>(list, new SameTuplesComparer());
Run Code Online (Sandbox Code Playgroud)

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

var hashSet = HashSet<Tuple<string, string>>(list);
Run Code Online (Sandbox Code Playgroud)

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

var uniquedList = hashSet.ToList();
Run Code Online (Sandbox Code Playgroud)

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