我做一些字节[]进行比较。

我试图==但这仅仅是类似的基的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)。在我的特定情况下,我只有简单的值类型

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top