列表使用Lambda排序?

时间:2015-01-30 21:31:32

标签: c# sorting lambda

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

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

因此它是国家/地区对象 - &gt;状态集合,每个状态都有一个名称属性,并且延迟加载它将状态对象投入到基于stateID的顺序中。

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

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

retVal的类型为IList<Country>

x=>x.Name

给出了错误
Delegate 'System.Comparison<Country>' does not take 1 arguments

3 个答案:

答案 0 :(得分:3)

Comparison委托是代表比较的代表,而不是投影。也就是说它需要两个对象,并且结果表明哪个是&#34;更小&#34;。您正在尝试提供投影或将一个对象转换为另一个对象。

要根据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)));
}

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

好的..我昨晚对这个问题非常沮丧,今天早上意识到真正的问题是.Sort不在那里。您需要呼叫的方法&#34;排序&#34;你的藏品是.OrderBy。

希望这有助于某人不要拔掉所有头发。