هل تريد التعبير عن وسيطات النوع العام لـ C# بشكل أكثر إيجازًا؟

StackOverflow https://stackoverflow.com//questions/9658658

سؤال

مستوحاة من

المقارنة بين مجموعتين من أجل المساواة بغض النظر عن ترتيب العناصر فيهما

لقد قمت بإنشاء طريقة تمديد لاختبار ما إذا كانت مجموعتان متكافئتان.لاستخدام طريقة الامتداد، لا بد لي من تحديد معلمتين من النوع مثل هذا:

IsEquivalentToTestHelper<ObservableCollection<string>, string>(first, second, true);

هل هناك طريقة لتنفيذ طريقة التمديد بحيث يكون هناك قيد عام واحد فقط (على سبيل المثال: ObservableCollection<string>) هل تحتاج إلى تحديد؟

تحديث:نشر الكود المعدل بناءً على الإجابات باعتباره استجابة إضافية على السؤال الذي ألهم هذا واحد.

هذا هو الكود الأصلي الخاص بي:

static public class EnumerableExtensions 
{
    static public bool IsEquivalentTo<E,T>(this E first, E second) where E : IEnumerable<T>
    {
        if ((first == null) != (second == null))
            return false;

        if (!object.ReferenceEquals(first, second) && (first != null))
        {
            if (first.Count() != second.Count())
                return false;

            if ((first.Count() != 0) && HaveMismatchedElement<E,T>(first, second))
                return false;
        }

        return true;
    }

    private static bool HaveMismatchedElement<E,T>(E first, E second) where E : IEnumerable<T>
    {
        int firstCount;
        int secondCount;

        var firstElementCounts = GetElementCounts<E,T>(first, out firstCount);
        var secondElementCounts = GetElementCounts<E,T>(second, out secondCount);

        if (firstCount != secondCount)
            return true;

        foreach (var kvp in firstElementCounts)
        {
            firstCount = kvp.Value;
            secondElementCounts.TryGetValue(kvp.Key, out secondCount);

            if (firstCount != secondCount)
                return true;
        }

        return false;
    }

    private static Dictionary<T, int> GetElementCounts<E,T>(E enumerable, out int nullCount) where E : IEnumerable<T>
    {
        var dictionary = new Dictionary<T, int>();
        nullCount = 0;

        foreach (T element in enumerable)
        {
            if (element == null)
            {
                nullCount++;
            }
            else
            {
                int num;
                dictionary.TryGetValue(element, out num);
                num++;
                dictionary[element] = num;
            }
        }

        return dictionary;
    }

    static private int GetHashCode<E,T>(IEnumerable<T> enumerable) where E : IEnumerable<T>
    {
        int hash = 17;

        foreach (T val in enumerable.OrderBy(x => x))
            hash = hash * 23 + val.GetHashCode();

        return hash;
    }
}
هل كانت مفيدة؟

المحلول

giveacodicetagpre.

نصائح أخرى

يمكنك إسقاط أول واحد والحفاظ على الثانية: giveacodicetagpre.

تحتاج فقط إلى استبدال كل E مع IEnumerable<T>, ، وقم بإسقاط عبارات أين

على سبيل المثال:

static public bool IsEquivalentTo<T>(this IEnumerable<T> first, IEnumerable<T> second)

var firstElementCounts = GetElementCounts<IEnumerable<T>,T>(first, out firstCount);

static private int GetHashCode<T>(IEnumerable<T> enumerable)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top