这个问题与此处提出的其他问题类似,但没有一个问题给出了我正在寻找的确切答案。
我有List
如下:
List<KeyValuePair<string, List<string>>> lstValuesTemp = new List<KeyValuePair<string, List<string>>>();
lstValuesTemp.Add(...);
然后,我想在OrderBy
的字符串键上使用KeyValuePair
使用匿名函数对列表进行稳定排序 - 如下所示:
var sortedArray = lstValuesTemp.OrderBy(a =>
{
//What to put here?
});
2个问题:
我收到编译错误:
错误CS0411:无法从用法推断出方法'System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable,System.Func)'的类型参数。尝试明确指定类型参数。
感谢您的帮助。
答案 0 :(得分:3)
如果您想按键排序,那么lambda需要从您的对象中拉出密钥。因此,由于您的列表属于KeyValuePair
,因此它只是a => a.Key
。
如果您对字符串(或其他类型)的实际意义感到困惑,您应该查看IComparable<T>
界面。这是通过类型T
的类来实现的,以提供一种方法来比较类型T
的对象,以表示一个元素在其前面,后面或具有相同的位置。如上所述here,String
实现了IComparable<String>
答案 1 :(得分:2)
您可以通过以下方式订购:
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
}
并且调用thia函数:
var ordered = lstValuesTemp.OrderBy(CustomOrder);
答案 2 :(得分:1)
对于该方法,您可以这样做
var sortedArray = lstValuesTemp.OrderBy(a =>
{
return a.Key;
});
由于您只进行会员访问,您还可以shorthand your Lambda到以下
.OrderBy(a => a.Key);
对于编译器错误,发生错误的原因仅仅是因为您还没有填写您的方法。
由于OrderBy需要Func,因此您无法从使用中推断出TResult,因为您还没有返回任何内容。如果你确实指定了类型参数,它会抱怨你的匿名方法没有返回值。
编辑:假设这不是非常抽象的,请参阅SortedDictionary类