使用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的示例
Jon*_*eet 16
我ProjectionComparer
在MiscUtil中有一个类,所以你可以这样做:
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)
我不知道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)
归档时间: |
|
查看次数: |
24704 次 |
最近记录: |