LINQ如何按给定标准对项目进行排序?

enz*_*m83 4 .net c# linq

假设我们有一个MyData实现IComparable<MyData>IComparable接口的类.然后我们有一个包含许多MyData元素的列表和一个LINQ查询来获取一个排序列表.

public class MyData : IComparable<MyData>, IComparable
{
    ...

    public int CompareTo(MyData value)
    {
        // TODO
    }

    public int CompareTo(object value)
    {
        if (value == null)
            return 1;

        if (value.GetType() == typeof(MyData))
        {
            MyData rightValue = (MyData)value;
            return (this.CompareTo(rightValue));
        }
        else throw new ArgumentException("Object is not a " + typeof(MyData) + ".");
    }
}

// main method
List<MyData> list = new List<MyData>();
...
var items = from item in list
            orderby item descending
            select item;
Run Code Online (Sandbox Code Playgroud)

当LINQ对其中的元素进行排序时list,它是否使用IComparableMyData类中接口的实现?

如果答案是肯定的,是否最好将排序条件封装在类中MyData(通过实现上述接口)或在LINQ查询中指定条件(没有MyData实现这些接口)?这两种选择的优缺点是什么?

Ree*_*sey 5

Enumerable.OrderBy "使用默认比较器Default来比较键",而后者将使用您的IComparable<T>实现.

如果答案是肯定的,是否最好将排序条件封装在MyData类中(通过实现上述接口)或在LINQ查询中指定条件(没有实现这些接口的MyData)?这两种选择的优缺点是什么?

首先,答案是肯定的.

两种方法都有优势.

实现IComparable<T>表明该类型具有自然顺序.如果是这样,我喜欢实现这个接口.就LINQ而言,主要的专业是你简化你的LINQ查询(一点点).但是,我的主要专业人员更倾向于对该给定类型的"自然"顺序的建议,这反过来又增加了API的清晰度.

在LINQ查询中指定标准的主要原因是灵活性.这允许您按任意数量的标准排序 - 不限制自己使用类型本身定义的给定排序.如果没有类型的"自然"排序顺序(即:它不代表某个"数量"本身或类似的东西),那么我个人使用这种方法.

  • @ enzom83性能差异可能微不足道.在这两种情况下,都使用`Comparer <T> .Default`,因此性能可能主要是由于比较器的性能与返回的特定成员的默认比较器的差异. (2认同)