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

本文关键字:列表 方法 排序 参数 何使用 | 更新日期: 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。