【发布时间】:2009-09-04 21:12:28
【问题描述】:
当你使用 linq 时,你有
c.Sort()
是否有任何好的内联方式来定义Comparison 和/或IComparer 类而无需实际创建单独的类?
【问题讨论】:
当你使用 linq 时,你有
c.Sort()
是否有任何好的内联方式来定义Comparison 和/或IComparer 类而无需实际创建单独的类?
【问题讨论】:
这是 lambda 表达式的用途之一:
c.Sort( (x,y) => x.A.CompareTo(y.A))
【讨论】:
Comparer<>.Create 从 IComparison<> 委托构造 IComparer<> 实例。
我在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 做同样的事情。
【讨论】:
乔恩的回答很棒,但可能有点过时了,
随着 .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;
}
}
【讨论】:
我不知道您的示例中的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
【讨论】:
如果列表 c 中的对象已经实现了 IComparable,则不需要另一个。 但是如果需要自定义比较,可以在嵌套类中实现 IComparer。 您还可以使用 lambda 表达式动态创建比较方法:
persons.Sort( (person1, person2) => person1.Age.CompareTo( person2.Age ) );
【讨论】: