稳定有序排序
本文关键字:排序 | 更新日期: 2023-09-27 18:05:41
这个问题与这里的其他问题相似,但没有一个人能给我想要的确切答案。
我有一个List
如下:
List<KeyValuePair<string, List<string>>> lstValuesTemp = new List<KeyValuePair<string, List<string>>>();
lstValuesTemp.Add(...);
然后,我想用一个匿名函数对KeyValuePair
的字符串键上的OrderBy
做一个稳定的列表排序-像这样:
var sortedArray = lstValuesTemp.OrderBy(a =>
{
//What to put here?
});
2题:
- 在函数中放入什么?
我得到一个编译错误:
错误CS0411:方法'System.Linq.Enumerable.OrderBy(System.Collections.Generic) '的类型参数。IEnumerable, System.Func)'不能从用法中推断出来。尝试显式指定类型参数。
谢谢你的帮助。
如果要按键排序,则lambda需要从对象中取出键。所以既然你的List是KeyValuePair
s,那么它就是a => a.Key
。
如果您对按字符串(或其他类型)排序的实际含义感到困惑,您应该查看IComparable<T>
接口。这是由T
类型的类实现的,它提供了一种方法来比较T
类型的对象,以表明一个元素在另一个元素之前、之后或具有相同的位置。如本文所述,String
实现了IComparable<String>
您可以按键订购:
var ordered = lstValuesTemp.OrderBy(v => v.Key);
或者你可以用函数
来排序这样声明函数:
public static string CustomOrder(KeyValuePair<string, List<string>> item)
{
//TODO: add some logic that return a string to compare this item
}
,然后调用函数:
var ordered = lstValuesTemp.OrderBy(CustomOrder);
对于方法,您可以这样做
var sortedArray = lstValuesTemp.OrderBy(a =>
{
return a.Key;
});
由于您只进行成员访问,您还可以将Lambda简写为以下
.OrderBy(a => a.Key);
对于编译错误,发生错误的原因很简单,因为您没有填写您的方法。
因为OrderBy需要一个Func,它不能从使用中推断结果,因为你没有返回任何东西。如果你指定了类型参数,它会抱怨你的匿名方法没有返回值。
编辑:假设这不是非常抽象,请参见SortedDictionary类