iEqualityCalParer.Akass عند استخدامها مع ienumerable.contains هو x أو y القيمة في القائمة؟

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

سؤال

يحتوي ienumberable على طريقة تمديد تحتوي علىu003CT> التي تأخذ اثنين من المعلمات. المعلمة الأولى هي القيمة اللازمة للتحقق من والثاني هو تطبيق iEqualityComparer. النظر في Iequalitycomparer.Akales يأخذ اثنين من المعلمات المسماة X و Y، بالنسبة للكائنات الأولى والثانية للمقارنة.

سؤالي هو x أو y القيمة من ienumerable؟

مثال

List<string> test = new List<String() { "a", "b", "c" };
test.Contains("d", myComparer);

عند استدعاءها إلى الأسلوب المستقيم للقيمة الأولى ستكون تساوي ("A"، "D") أو يساوي ("D"، "A")؟

هل كانت مفيدة؟

المحلول

يجب ألا يهم - المساواة يجب أن تكون متماثلة. من مستندات IEqualityComparer<T>.Equals:

الطريقة المستقيمة انعكاسية، متماثلة، متعدية. وهذا يعني أنه صحيح إذا استخدم لمقارنة كائن بحد ذاته؛ صحيح بالنسبة إلى كائنين X و Y إذا كان صحيحا بالنسبة ل Y و X؛ وتصدر كائنين X و Z إذا كان صحيحا ل X و Y وينطبق أيضا على Y و Z.

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

نصائح أخرى

من أجل الاكتمال برصم التعليمات البرمجية المنعكسة في إبرامات IEnumberable على الجانب الأيسر (انظر أدناه). ومع ذلك، لا يعتزم عدم التغيير، لذلك هناك خطر في استخدامه.

public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer)
{
    if (comparer == null)
    {
        comparer = EqualityComparer<TSource>.Default;
    }
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    foreach (TSource local in source)
    {
        if (comparer.Equals(local, value))
        {
            return true;
        }
    }
    return false;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top