列表的排序使用 Lambda?

List's Sort Using Lambda?

我想做的是遍历 retVal 中的国家/地区集合,并按 Name 对每个 <StateProvinces> 进行排序。层次结构如下:

retVal[index].StateProvinces.ToList()[index].Name = "";

因此它是国家对象 -> 状态集合,每个状态都有一个名称 属性 并延迟加载它,将状态对象扔到基于状态 ID 的顺序中。

这行代码有什么问题(以及为什么虽然我猜我在试图滥用排序方法)?

retVal[0].StateProvinces.ToList().Sort(x=>x.Name);

retVal 的类型是 IList<Country>

x=>x.Name 出现错误:

Delegate 'System.Comparison<Country>' does not take 1 arguments

正如错误所说,Comparison<T> 需要两个参数而不是一个,你想要这样的东西:

retVal[0].StateProvinces.ToList().Sort((x,y) => x.Name.CompareTo(y.Name));

Comparison 委托是代表比较而非投影的委托。也就是说它需要两个对象,一个结果表明哪个是"smaller"。您正在尝试提供一个对象到另一个对象的投影或转换。

要根据 Name 对其中两个对象进行比较,您需要编写如下内容:

(a,b) => string.Compare(a.Name, b.Name);

您还可以编写一个单独的方法来对使用投影而不是比较器的列表进行排序,这样您就不需要在每次调用 Sort:

时都这样做
//TODO come up with a better name, but it still has to be different from `Sort`
public static void ProjectionSort<T, TKey>(
    this List<T> list,
    Func<T, TKey> selector,
    Comparer<TKey> comparer)
{
    comparer = comparer ?? Comparer<TKey>.Default;
    list.Sort((a, b) => comparer.Compare(selector(a), selector(b)));
}

好的.. 昨晚我对这个问题感到非常沮丧,今天早上意识到真正的问题是 .Sort 不存在。您需要调用 "Sort" 您的 collections 的方法是 .OrderBy.

希望这可以帮助人们不要拔掉所有的头发。