使用OrderBy进行稳定排序

时间:2014-05-29 14:55:37

标签: c# linq

这个问题与此处提出的其他问题类似,但没有一个问题给出了我正在寻找的确切答案。

我有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个问题:

  1. 该功能应该放什么?
  2. 我收到编译错误:

      

    错误CS0411:无法从用法推断出方法'System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable,System.Func)'的类型参数。尝试明确指定类型参数。

  3. 感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

如果您想按键排序,那么lambda需要从您的对象中拉出密钥。因此,由于您的列表属于KeyValuePair,因此它只是a => a.Key

如果您对字符串(或其他类型)的实际意义感到困惑,您应该查看IComparable<T>界面。这是通过类型T的类来实现的,以提供一种方法来比较类型T的对象,以表示一个元素在其前面,后面或具有相同的位置。如上所述hereString实现了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