如何使用使用列表项作为参数的方法对列表进行排序
本文关键字:列表 方法 排序 参数 何使用 | 更新日期: 2023-09-27 18:31:26
假设我有以下列表和方法:
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
时,此操作将失败,因为字典必须具有一组唯一的键。 对此列表进行排序的最佳方法是什么?
你试过使用 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());
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。