C#linq sort - 实例化IComparer的快捷方式

时间:2009-09-04 21:12:29

标签: c# linq

使用linq时你有

c.Sort()

是否有任何良好的内联方式来定义Comparison和/或IComparer类而无需实际创建单独的类?

5 个答案:

答案 0 :(得分:55)

这是lambda表达式的一个用法:

c.Sort( (x,y) => x.A.CompareTo(y.A))

编辑:修复示例返回int(使用CompareTo)而不是bool

答案 1 :(得分:16)

我在MiscUtil中有一个ProjectionComparer课程,您可以这样做:

IComparer<Foo> comparer = ProjectionComparer<Foo>.Create(x => x.Name);
c.Sort(comparer);

代码也在this answer

您也可以直接使用lambda表达式创建Comparison<T>实例,但我通常不喜欢涉及的重复。说了这些,它往往会变得更短......

编辑:如上所述,从.NET 4.5开始,使用Comparer<T>.Create做同样的事情。

答案 2 :(得分:10)

Jon的回答很棒,但可能有点过时, 随着.NET 4.5的发布,我们现在(终于!)拥有这个非常棒的方法Comparer<T>.Create

items.Sort((x, y) => x.Value.CompareTo(y.Value)); //sorting List<T>                
items.OrderBy(x => x, Comparer<Item>.Create((x, y) => x.Value.CompareTo(y.Value))); //sorting IEnumerable<T>

假设Item定义如下:

class Item
{
    public readonly int Key;
    public readonly string Value;

    public Item(int key, string value)
    {
        Key = key;
        Value = value;
    }
}

答案 3 :(得分:7)

我不知道你的例子中有c.Sort()是什么,因为它可以是很多东西(你的意思是List<T>.Sort()吗?),但有一件事肯定不是LINQ。 LINQ没有Sort() - 它有OrderBy()

也就是说,后者也适用于IComparer,并且无法创建实现“内联”接口的匿名类实例,因此您必须定义一个类。

对于List<T>.Sort(),有一个重载需要Comparison<T>。由于它是委托类型,因此您可以使用lambda来提供内联函数:

List<int> xs = ...;
xs.Sort((x, y) => y - x); // reverse sort

答案 4 :(得分:3)

如果List c中的对象已经实现了IComparable,那么您将不需要另一个。 但是,如果需要自定义比较,则可以在嵌套类中实现IComparer。 您还可以使用lambda表达式动态创建比较方法:

persons.Sort( (person1, person2) => person1.Age.CompareTo( person2.Age ) );