我想有一个扩展方法“等于” 2个字节阵列之间
-
20-08-2019 - |
题
我做一些字节[]进行比较。
我试图==但这仅仅是类似的基的Equals,其中:
byte[] a = {1,2,3};
byte[] b = {1,2,3};
bool equals = a == b; //false
equals = a.Equals(b); //false
我试图添加一个扩展方法,但由于过载基站类等于采用相同的参数,它进入基方法而到延伸,有反正我可以使用的Equals分机(wthout改变它的名字。 ..)或(更好)使用==运算?
下面是我真正要比较:
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;
}
解决方案
using System.Linq;
byte[] a = {1,2,3};
byte[] b = {1,2,3};
bool same = a.SequenceEqual(b);
其他提示
您肯定做不到运营商扩展方法重载。它不为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;
}
我这样做为了同样的目的:
static class Global
{
public static bool ArraysAreEqual(Array arr1, Array arr2)
{
if (arr1.Length != arr2.Length)
return false;
System.Collections.IEnumerator e1 = arr1.GetEnumerator();
System.Collections.IEnumerator e2 = arr2.GetEnumerator();
while(e1.MoveNext() && e2.MoveNext())
{
if(!e1.Current.Equals(e2.Current))
return false;
}
return true;
}
}
但要注意的是,.Equals()甚至可能在引用类型返回false时,他们是平等的(我没有测试,但你可以尝试的StringBuilder)。在我的特定情况下,我只有简单的值类型
不隶属于 StackOverflow