gpt4 book ai didi

c# - 我想在 2 字节数组之间有一个扩展方法 "Equals"

转载 作者:太空宇宙 更新时间:2023-11-03 17:23:30 25 4
gpt4 key购买 nike

我正在做一些 byte[] 比较。

我试过 == 但这就像基本的 Equals,它:

byte[] a = {1,2,3};
byte[] b = {1,2,3};
bool equals = a == b; //false
equals = a.Equals(b); //false

我试图添加一个扩展方法,但由于重载基类的 Equals 采用相同的参数,它转到基类方法而不是扩展,无论如何我可以使用 Equals 扩展(不更改它的名称。 ..) 或(甚至更好)使用 == 运算符?

这是我实际需要比较的内容:

public static bool ContentEquals(this byte[] array, byte[] bytes)
{
if (array == null || bytes == null) throw new ArgumentNullException();
if( array.Length != bytes.Length) return false;
for (int i = 0; i < array.Length; i++)
if (array[i] != bytes[i]) return false;

return true;
}

最佳答案

您当然不能使用扩展方法进行运算符重载。它不适用于 Equals 的原因方法是,如果任何方法在不使用扩展方法的情况下适用,那么在检查扩展方法之前将选择该方法。

即使您的 Equals方法在将参数类型转换为形式参数类型方面“更好”,编译器总是更喜欢“正常”方法。您必须为您的方法指定一个不同的名称。

但是,您始终可以使用 Enumerable.SequenceEquals方法。我不相信会短路长度检查(即使它可以,对于 ICollection<T> 实现)。不过,您始终可以自己实现更高效的版本。实际上,如果您只是将现有的数组实现更改为 SequenceEquals甚至 ArrayEquals ,那会很好:

public static bool ArrayEquals(this byte[] array, byte[] bytes)
{
// I'd personally use braces in all of this, but it's your call
if (array.Length != bytes.Length) return false;
for (int i = 0; i < array.Length; i++)
if (array[i] != bytes[i]) return false;

return true;
}

请注意,将其设为通用会非常好,但由于无法内联比较,这肯定会降低一些性能:

public static bool ArrayEquals<T>(this T[] first, T[] second)
{
// Reference equality and nullity checks for safety and efficiency
if (first == second)
{
return true;
}
if (first == null || second == null)
{
return false;
}
if (first.Length != second.Length)
{
return false;
}
EqualityComparer<T> comparer = EqualityComparer<T>.Default;
for (int i = 0; i < first.Length; i++)
{
if (!comparer.Equals(first[i], second[i]))
{
return false;
}
}
return true;
}

关于c# - 我想在 2 字节数组之间有一个扩展方法 "Equals",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1054459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com