【问题标题】:Linqs is ".Distinct()"ly IndistinctLinqs 是 ".Distinct()"ly 模糊不清
【发布时间】:2012-07-28 13:40:33
【问题描述】:
using System.Linq;

var a = new byte?[][,]{
    new byte?[,]{{1}},
    new byte?[,]{{1}},
    new byte?[,]{{2}},
    new byte?[,]{{1, 2, 3}, {4, 5, 6}}};
a = a.Distinct().ToArray();

但是 'a' 仍然包含重复项。我这样做对吗?


谢谢。根据答案中的信息。

class Nullable_Byte_2D_Array_EqualityComparer : IEqualityComparer<byte?[,]>
{
    public bool Equals(byte?[,] a, byte?[,] b)
    {
        var r = a.GetLength(0) == b.GetLength(0) &&
            a.GetLength(1) == b.GetLength(1);
        if (r)
        {
            var v = new byte?[a.Length];
            byte n = 0;
            foreach (byte? c in a)
            {
                v[n] = c;
                n++;
            }
            n = 0;
            foreach (byte? c in b)
            {
                if (c != v[n])
                    r = false;
                n++;
            }
        }
        return r;
    }
}

a = a.Distinct(new Nullable_Byte_2D_Array_EqualityComparer()).ToArray();

【问题讨论】:

  • 我认为Distinct 正在对字节数组进行引用相等。
  • 第二个参数 (?) 上缺少可以为空的指定。 public bool Equals(byte?[,] a, byte?[,] b) 应该修复它。
  • 呵呵,谢谢 SPFiredrake。

标签: c# linq collections filter abstraction


【解决方案1】:

它不包含重复项。它包含两个不同的数组,它们恰好在其中具有相同的值。由于数组是引用类型,Distinct() 默认会进行引用比较;要更改此行为,请使用 this override 指定您自己的比较器。

【讨论】:

  • 这如何应用于我的示例?所以这是关于为我正在使用的类型实现 .Equals(),除了我使用的是 Array,所以我只需要覆盖 [,] 2D 类型的 Array?
  • 您需要创建一个实现IEqualityComparer&lt;byte[,]&gt; 的类并将其实例传递给Distinct()。有关详细信息,请参阅 MSDN 文档:msdn.microsoft.com/en-us/library/ms132151.aspx
猜你喜欢
  • 2012-08-23
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多