使用 SequenceEqual 比较 C# 中的数组

Compare Arrays in C# using SequenceEqual

提问人:malat 提问时间:9/10/2021 更新时间:9/10/2021 访问量:2378

问:

我正在尝试比较 C# 中的两个数组,如上一篇文章中发布的那样:

为什么以下内容对我不起作用:

var first = Value as Array;
var second = other.Value as Array;
bool equal = first.SequenceEqual(second);

我得到:

CS1061:“Array”不包含“SequenceEqual”的定义,并且 没有可访问的扩展方法“Array”接受第一个参数 可以找到类型“Array”(您是否缺少 using 指令或 程序集引用?

我确实有权在顶部使用:

using System.Linq;

因为我可以写(没有编译器错误):

var first = Value as string[];
var second = other.Value as string[];
bool equal = first.SequenceEqual(second);

作为参考,我正在尝试实现泛型值类型的运算符:Equals

public struct MyValue<T> : IEquatable<MyValue<T>> 
{
  public T Value { get; set; }
  public bool Equals(VRValue<T> other) => throw new NotImplementedException();
}
C# 数组 LINQ 泛型相

评论

1赞 SomeBody 9/10/2021
Array实现,但仅针对IEnumerableSequenceEqualIEnumerable<T>
1赞 Sweeper 9/10/2021
与其检查 ,更好的方法是检查 IStructuralEquatable,它(和其他一些集合)实现了。ArrayArray
0赞 Matthew Watson 9/10/2021
您可以通过强制转换其元素来将 Linq 与 一起使用,例如Arraybool equal = first.Cast<object>().SequenceEqual(second.Cast<object>());

答:

2赞 Serg 9/10/2021 #1

SequenceEqual适用于 ,但仅实现非泛型 ,因此在这里不适用。IEnumerable<T>ArrayIEnumerableSequenceEqual

当转换为 时,你得到了不同(类型化)类型的数组,它完全实现了(其中 T 是此示例的字符串)string[]IEnumerable<T>

1赞 malat 9/10/2021 #2

使用 @Sweeper/@Jeppe Stig Nielsen 的建议,我将我的函数重写为:

public bool Equals(VRValue<T> other)
{
    if (typeof(T).IsArray)
    {
        var first = Value as IStructuralEquatable;
        var second = other.Value as IStructuralEquatable;
        return StructuralComparisons.StructuralEqualityComparer.Equals(first, second);
    }
  [...]
}

使用 HashSet 时,还应注意 GetHashCode:

public override int GetHashCode()
{
    if (typeof(T).IsArray)
    {
        var first = Value as IStructuralEquatable;
        return StructuralComparisons.StructuralEqualityComparer.GetHashCode(first);
    }
    [...]
}

评论

1赞 Jeppe Stig Nielsen 9/10/2021
考虑。(你现在所拥有的只是检查同一性(即引用相等),所以如果两个操作数是具有相同长度和相同条目的不同数组,则相当于哪个数组会说 false。return StructuralComparisons.StructuralEqualityComparer.Equals(first, second);return first == second;
1赞 Jeppe Stig Nielsen 9/10/2021
对于“获取哈希代码”,您必须使用相关方法,而不仅仅是其他方法!所以现在你肯定遵循了我第一条评论的建议。哈希码应与使用的哈希码匹配,否则一切都是无稽之谈。 在你的情况下真的错了。return StructuralComparisons.StructuralEqualityComparer.GetHashCode(first);EqualsEqualityComparer<object>.Default