稳定有序排序

本文关键字:排序 | 更新日期: 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题:

  1. 在函数中放入什么?
  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类