c# -当一个列表按另一个列表排序时,默认比较器不能按预期工作

本文关键字:列表 默认 比较器 不能按 工作 排序 一个 另一个 | 更新日期: 2023-09-27 18:14:16

我有两个列表如下(这是一个简化的例子):

var dataList = new List<char>{ 'a', 'b', 'c', 'd', 'e', 'f' };
var sortList = new List<int>{ 6, 5, 4, 3, 2, 1 };

我的排序方法是这样的:

void SortOneListByAnother<T1, T2>(List<T1> dataList, List<T2> sortList)
    where T1 : IComparable
    where T2 : IComparable
{
    dataList.Sort((a, b) => sortList[dataList.IndexOf(a)].CompareTo(sortList[dataList.IndexOf(b)]));
}

这个应该返回与sortList排序方式相同的dataList(字符列表)(在本例中是反向排序),即:

{ 'f', 'e', 'd', 'c', 'b', 'a' }

相反,我的代码似乎忽略了列表的第一个和最后一个元素(同时正确排序中间的所有元素);因此我得到:

{ 'a', 'e', 'd', 'c', 'b', 'f' }

我可能做错了什么?

c# -当一个列表按另一个列表排序时,默认比较器不能按预期工作

我认为这里的问题是列表。Sort执行就地排序,所以当你的比较调用dataList.IndexOf(a)时,元素已经部分排序,所以你得到未定义的行为。

你需要做一个原始dataList的副本,并在排序时使用它来查找索引。

示例代码:

void SortOneListByAnother<T1, T2>(List<T1> dataList, List<T2> sortList)
    where T1 : IComparable
    where T2 : IComparable
{
    var lookupList = new List<T1>(dataList);
    dataList.Sort((a, b) => sortList[lookupList.IndexOf(a)].CompareTo(sortList[lookupList.IndexOf(b)]));
}

顺便说一下,这个排序算法可能有O(n^3)最坏情况的时间复杂度。