从 CSharp 中的二维列表中删除重复条目

Remove Duplicate entries from a 2D list in CSharp

如何在 C# 中删除二维列表中的重复项。 这是我的代码。

HashSet<List<int>> set =  new HashSet<List<int>>();
set.Add(new List<int>(){1,-2,-1,2});
set.Add(new List<int>(){3,-2,1,1});
set.Add(new List<int>() {1,-2,-1,2}); //duplicate entry

但是我从中得到的结果有重复条目 {{1,-2,-1,2},{3,-2,1,1},{1,-2,-1,2}} 我也尝试使用 set.Distinct().ToList() 但我的结果仍然重复。

请有人指点我使用 HashSet 完成这项工作的巧妙方法。我不想比较列表中的每个序列,因为这会增加我的代码的时间复杂度。

感谢您的期待帮助。

您可以创建 IEqualityComparer 的实现并将其传递给 Distinct 函数。

在您执行 IEqualityComparer 的过程中,对列表进行排序并检查是否存在例外(或相交),如果存在则两个列表不相等。

您还可以对每个列表做一个简单的循环,如果相同键的数量等于您的列表长度,则检查相同索引中的项目,然后消除其中的一个。

您可以编写自己的 IEqualityComparer<List<int>> (and use a SequenceEqual 列表相等方法的实现)

public class ListComparer : IEqualityComparer<List<int>>
{
    public bool Equals(List<int> x, List<int> y)
    {
        return x.SequenceEqual(y);
    }

    public int GetHashCode(List<int> obj)
    {
        return obj.Aggregate(19, (current, item) => current ^ item.GetHashCode());
    }
}

然后将其实例传递给Distinct方法

var set = new HashSet<List<int>>
{
    new List<int>() {1, -2, -1, 2}, new List<int>() {3, -2, 1, 1}, new List<int>() {1, -2, -1, 2}
};

var result = set.Distinct(new ListComparer());

它允许您删除 {1,-2,-1,2} 重复的条目。

您还可以将 ListComparer 实例传递给 HashSet 构造函数并避免添加重复列表

var set = new HashSet<List<int>>(new ListComparer())
{
    new List<int>() {1, -2, -1, 2}, new List<int>() {3, -2, 1, 1}, new List<int>() {1, -2, -1, 2}
};

在上面的例子中 set 将只包含两个没有重复列表的项目