如何使用将列表项作为参数的方法对列表进行排序?

时间:2013-09-16 16:38:10

标签: c# list sorting

我们说我有以下列表和方法:

List<myObject> myList = (some function that prepopulates myList);

我想使用我创建的方法按降序排序myList

int sortByThisValue(myObject obj)
{
    int someInteger;
    // Operations on obj that generates a value for someInteger
    ...
    return someInteger;
}

首先想到的解决方案是创建一个排序的Dictionary,然后将这些值作为列表提取出来。但是,当两个对象生成相同的someInteger时,这会失败,因为字典必须具有唯一的一组键。排序此列表的最佳方式是什么?

2 个答案:

答案 0 :(得分:3)

您是否尝试过使用LINQ

myList = myList.OrderByDescending(p=>p.someInteger).ToList();

或Asecending

myList = myList.OrderBy(p=>p.someInteger).ToList();

或者,如果要进行手动排序,可以实现IComparer接口。如果排序很复杂并且使用LINQ无法轻松实现,则可能需要这样做。

class MyListSorter : IComparer<myObject>
{
    public int Compare(myObject x, myObject y)
    {
        if (x.Num < y.Num) return 1;
        if (x.Num > y.Num) return -1;
        return 0;
    }
}

myList.Sort(new MyListSorter());

答案 1 :(得分:2)

LINQ让这一切变得简单:

// Method group conversion
List<myObject> sorted = myList.OrderByDescending(SortByThisValue).ToList();

// Lambda expression
List<myObject> sorted = myList.OrderByDescending(x => SortByThisValue(x))
                              .ToList();

请注意,对列表进行就地排序;它创建了一个新列表。如果您不需要实际创建新列表,请在结尾处删除ToList来电,例如

foreach (MyObject item in myList.OrderByDescending(x => SortByThisValue(x))
{
    // Do something
}

非常值得研究LINQ - 它使各种数据查询真的简单。

如果您绝对需要就地排序,可以使用:

myList.Sort((x, y) => SortByThisValue(y).CompareTo(SortByThisValue(x)));

(注意在这里使用y后跟x - 这就是反转“自然”排序的原因,以便您按降序获取值。)

虽然它比LINQ版本更丑,IMO。