gpt4 book ai didi

c# - 默认比较器在 C# 中如何工作?

转载 作者:太空狗 更新时间:2023-10-29 20:33:28 26 4
gpt4 key购买 nike

我正在使用 OrderBy 进行一些基于属性的排序,我找到了 documentation for the default comparer但它并没有向我解释太多。如果一个对象没有实现 System.IComparable<T> ,它如何生成 Comparer<T>

例如,我目前正在根据 object 类型的属性值对对象列表进行排序.它们是下面的数字类型,排序工作正常。 C#/Linq 如何知道如何对对象进行排序?它是否对基元进行了一些拆箱?它会做一些哈希检查吗?这将如何转化为大于或小于?

如果它们是更复杂的类型,这会因错误而失败,还是 OrderBy 什么都不做,或者它甚至会以一种毫无意义的方式排序?

最佳答案

好吧,你可以检查引用来源和see for yourself它的作用。

    public static Comparer<T> Default {
get {
Contract.Ensures(Contract.Result<Comparer<T>>() != null);

Comparer<T> comparer = defaultComparer;
if (comparer == null) {
comparer = CreateComparer();
defaultComparer = comparer;
}
return comparer;
}
}
private static Comparer<T> CreateComparer() {
RuntimeType t = (RuntimeType)typeof(T);

// If T implements IComparable<T> return a GenericComparer<T>
#if FEATURE_LEGACYNETCF
//(SNITP)
#endif
if (typeof(IComparable<T>).IsAssignableFrom(t)) {
return (Comparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(GenericComparer<int>), t);
}

// If T is a Nullable<U> where U implements IComparable<U> return a NullableComparer<U>
if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) {
RuntimeType u = (RuntimeType)t.GetGenericArguments()[0];
if (typeof(IComparable<>).MakeGenericType(u).IsAssignableFrom(u)) {
return (Comparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(NullableComparer<int>), u);
}
}
// Otherwise return an ObjectComparer<T>
return new ObjectComparer<T>();
}

所以它所做的是检查类型是否实现了 IComparable<T> ,如果它这样做,它会使用内置于该类型的比较器(您的数字类型对象列表将遵循此分支)。如果类型是 Nullable<ICompareable<T>>,它会再次进行同样的检查。 .如果这也失败了,它使用 ObjectComparer使用Comparer.Default .

Here is the Compare code对于 Comparer.Default

    public int Compare(Object a, Object b) {
if (a == b) return 0;
if (a == null) return -1;
if (b == null) return 1;
if (m_compareInfo != null) {
String sa = a as String;
String sb = b as String;
if (sa != null && sb != null)
return m_compareInfo.Compare(sa, sb);
}

IComparable ia = a as IComparable;
if (ia != null)
return ia.CompareTo(b);

IComparable ib = b as IComparable;
if (ib != null)
return -ib.CompareTo(a);

throw new ArgumentException(Environment.GetResourceString("Argument_ImplementIComparable"));
}

如您所见,它检查是否 ab工具 IComparable如果两者都不做,则抛出异常。

关于c# - 默认比较器在 C# 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31952846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com