0

假设我有以下列表和方法:

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;
}

想到的第一个解决方案是创建一个排序字典,然后将值提取为列表。但是,当两个对象生成相同的对象时,这会失败,someInteger因为字典必须具有一组唯一的键。对该列表进行排序的最佳方法是什么?

4

2 回答 2

3

你试过使用LINQ吗?

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

或升序

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());
于 2013-09-16T16:40:04.200 回答
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。

于 2013-09-16T16:40:25.527 回答