سؤال

وأنا أفعل بعض بايت [] المقارنات.

وحاولت == ولكن هذا هو تماما مثل قاعدة يساوي، منها:

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

وحاولت إضافة طريقة التمديد، ولكن منذ الفئة الأساسية زائد "يساوي يأخذ نفس الحجج، فإنه يذهب إلى أسلوب القاعدة بدلا من ذلك إلى التمديد، هناك على أية حال أنا يمكن استخدام يساوي تمديد (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;
}

لاحظ أنه سيكون من الرائع جدا أن تجعل من عام، ولكن هذا بالتأكيد سيكلف قليلا من الأداء لا يمكن أن inlined المقارنة:

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 () قد حتى عودة كاذبة على مرجعية أنواع عندما تكون المساواة (لم أكن الاختبار، ولكن يمكنك أن تجرب مع ب StringBuilder). في حالتي خاصة وليس لدي سوى بسيطة القيمة أنواع

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top