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' }
我可能做错了什么?
我认为这里的问题是列表。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)最坏情况的时间复杂度。