C# - 当一个列表被另一个列表排序时,默认Comparer无法按预期工作

时间:2016-10-22 19:33:37

标签: c# list sorting icomparable

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

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

这个应该返回dataList(字符列表),其排序方式与sortList的排序方式相同(在这种情况下,反向顺序),即:

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

相反,我的代码似乎忽略了列表的第一个和最后一个元素(同时正确地对它们之间的所有内容进行排序);因此我得到了:

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

我可能做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为这里的问题是List.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)最坏情况时间复杂度。