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

Dan*_*iel 28 c# linq

使用linq时,你有

c.Sort()
Run Code Online (Sandbox Code Playgroud)

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

cka*_*ras 56

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

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

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

  • 你是对的.这适用于IComparison,而不适用于IComparable.花费大约一小时的时间尝试使用NUnit CollectionAssert.IsOrdered方法来解决它没有的问题.所有文档和文章都令人困惑,因为它们使用sort方法作为示例.sort方法具有IComparer和IComparison的重载.这仅适用于sort方法,因为IComparison过载. (3认同)
  • @Brett但是在即将到来的.NET4.5中,你可以通过调用新的静态工厂方法`Comparer <>.Create`从`IComparison <>`委托构造一个`IComparer <>`实例. (3认同)

Jon*_*eet 16

ProjectionComparerMiscUtil中有一个类,所以你可以这样做:

IComparer<Foo> comparer = ProjectionComparer<Foo>.Create(x => x.Name);
c.Sort(comparer);
Run Code Online (Sandbox Code Playgroud)

代码也在这个答案中.

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

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


ill*_*ant 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>
Run Code Online (Sandbox Code Playgroud)

假设Item定义如下:

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

    public Item(int key, string value)
    {
        Key = key;
        Value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)


Pav*_*aev 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
Run Code Online (Sandbox Code Playgroud)

  • @Joel:语言在问题的标签中明确指定. (2认同)