我们说我有以下列表和方法:
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
时,这会失败,因为字典必须具有唯一的一组键。排序此列表的最佳方式是什么?
答案 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。