如何删除C#元组列表中的反向重复项

Dud*_*365 3 c# asp.net tuples

假设我有一个像这样的元组列表:

    List<Tuple<string, string>> conflicts = new List<Tuple<string, string>>();
    conflicts.Add(new Tuple<string, string>("Maths", "English"));
    conflicts.Add(new Tuple<string, string>("Science", "French"));
    conflicts.Add(new Tuple<string, string>("French", "Science"));
    conflicts.Add(new Tuple<string, string>("English", "Maths"));
Run Code Online (Sandbox Code Playgroud)

我想检查元组列表的反向重复并删除它们,我将如何使用循环执行此操作?

注意:通过反向复制,我的意思是"英语","数学"和"数学","英语"的再次出现

注意:我的代码中的我的元组是使用SqlDataReader填充的,但我上面使用的示例非常接近它的布局方式.

这看起来很简单,但整晚都难倒

Ese*_*ser 5

随着自定义 IEqualityComparer

public class TupleComparer : IEqualityComparer<Tuple<string, string>>
{
    public bool Equals(Tuple<string, string> x, Tuple<string, string> y)
    {
        return  (x.Item1 == y.Item1 && x.Item2 == y.Item2) ||
                (x.Item1 == y.Item2 && x.Item2 == y.Item1);
    }

    public int GetHashCode(Tuple<string, string> obj)
    {
        return string.Concat(new string[] { obj.Item1, obj.Item2 }.OrderBy(x => x)).GetHashCode();
        //or
        //return (string.Compare(obj.Item1, obj.Item2) < 0 ? obj.Item1 + obj.Item2 : obj.Item2 + obj.Item1).GetHashCode(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用HashSet<Tuple<string, string>>而不是List<Tuple<string, string>>

var conflicts = new HashSet<Tuple<string, string>>(new TupleComparer());
conflicts.Add(new Tuple<string, string>("Maths", "English"));
conflicts.Add(new Tuple<string, string>("Science", "French"));
conflicts.Add(new Tuple<string, string>("French", "Science"));
conflicts.Add(new Tuple<string, string>("English", "Maths"));
Run Code Online (Sandbox Code Playgroud)