سؤال

ولدي بعض الأنواع العامة، كما يلي:

public struct Tuple<T1, T2> { ... }
public struct Tuple<T1, T2, T3> { ... }
etc.

وهذه يجب من الناحية النظرية أن تكون قادرا على مقارنة نفسها ضد قيم أخرى من نفس النوع، بحيث أستطيع أن أكتب نوع التعليمات البرمجية التالية:

List<Tuple<Type, String>> l = new List<Tuple<Type, String>>();
l.Add(new Tuple<Type, String>(typeof(ISomeInterface), "123"));
if (l.Contains(new Tuple<Type, String>(typeof(ISomeOtherInterface), "123"))
    ...

للأسف، كان هناك خلل في قانون بلدي، ويصبح السؤال بعد ذلك كيفية القيام بذلك بشكل صحيح.

وكان علة للقيام بتنفيذ نظري CompareTo>، والتي تبدو في الأساس من هذا القبيل:

Int32 result = HelperMethods.CompareTwoFields<T1>(_Value1, other._Value1);
if (result != 0)
    return result;

Int32 result = HelperMethods.CompareTwoFields<T2>(_Value2, other._Value2);
if (result != 0)
    return result;

return 0;

وHelperMethods.CompareTwoFields يبدو مثل هذا:

internal static Int32 CompareTwoFields<T>(T field1, T field2)
{
    Int32 result = 0;
    if (ReferenceEquals(field1, null) != ReferenceEquals(field2, null))
        result = ReferenceEquals(field1, null) ? -1 : +1;
    else if (!ReferenceEquals(field1, null) && field1 is IComparable<T>)
        result = ((IComparable<T>)field1).CompareTo(field2);
    else if (!typeof(T).IsValueType)
    {
        if (Object.ReferenceEquals(field1, field2))
            return 0;
        else
            return field1.ToString().CompareTo(field2.ToString());
    }
    return result;
}

وكانت آخر إذا-بيان هناك شيء أنا مدسوس الآن إلى إصلاح الخلل، ولكن هل هذا صحيح؟

وأساسا، كيف يمكنني مقارنة كائنين نوع؟ هل هناك مقارنة ذات مغزى لهؤلاء، إلا فقط لتحويلها إلى سلسلة ومقارنة؟

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

المحلول

هل تقصد:

bool equal = EqualityComparer<T>.Default.Equals(val1,val2);

وهذا يعمل مع IEquatable<T>T : IEquatable<T>)، وإلا يرتد إلى object.Equals.

ووComparer<T>.Default هناك أيضا لإجراء مقارنات عدم المساواة (أكبر / أقل):

int delta = Comparer<T>.Default.Compare(val1,val2);

وهذا يستخدم T : IComparable<T>، أو T : IComparable خلاف ذلك.

وبالمناسبة، Type ينبغي أن مجرد استخدام إشارة العادية قارن المقدمة من object.Equals، لذلك يجب فقط تعمل بشكل جيد مع ما ورد أعلاه.

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