【问题标题】:Remove Duplicate entries from a 2D list in CSharp从 CSharp 中的 2D 列表中删除重复条目
【发布时间】:2020-06-16 17:52:33
【问题描述】:

如何在 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 完成这项工作的巧妙方法。我不想比较列表中的每个序列,因为这会给我的代码增加一些时间复杂度。

感谢您的帮助。

【问题讨论】:

  • 输入真的是一个二维(又名多维)列表(即声明为int[,] a1 = new int[3,4];)还是一个锯齿数组(即声明为int[][] a2 = new int[3][];)?答案会因数组的类型而异。
  • 它是一个二维列表,所以我猜你也可以称它为锯齿状数组

标签: c# .net list duplicates hashset


【解决方案1】:

您可以编写自己的IEqualityComparer&lt;List&lt;int&gt;&gt; 实现(并使用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 将只包含两个没有重复列表的项目

【讨论】:

  • 感谢您的帮助..您的解决方案解决了我的问题。尽管我试图了解幕后发生的事情。我不知道为什么 HashSet 不能立即解决我的问题
  • @paulmbaike 因为您使用List&lt;int&gt; 作为哈希集的一项。默认情况下,所有引用对象都通过引用而不是内容进行比较,因此哈希集将所有列表项理解为不同的项。因此,您应该使用带有SequenceEqual 方法的自定义比较器。您可以将 new ListComparer() 传递给哈希集 ctor 以获得预期的行为,我会更新答案
  • 但是这个实现在java中工作。我想这里的要点是“参考对象是通过参考而不是内容进行比较”非常感谢您的澄清
【解决方案2】:

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

在您执行 IEqualityComparer 时,对列表进行排序并检查除(或相交)是否存在,则两个列表不相等。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2014-04-19
    • 2013-03-09
    • 2021-07-07
    相关资源
    最近更新 更多