如何使用另一个List <int>对List <int>进行排序?

时间:2017-07-06 21:51:01

标签: c# list sorting int

我需要使用另一个列表对列表进行排序。 我正在尝试使用:

var docsIds = new List<int>() { 1, 7, 4 };
var tileSizes = new List<int>();
tileSizes = tileSizes.OrderBy(x => docsIds.IndexOf());

输入:1,2,3,4,5,6,7

预期产出:1,7,4,2,3,5,6

感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

假设tileSizes只有从docIds中选择的值(这似乎是意图,虽然问题有点不清楚),但缺失的部分是IndexOf()的参数,特别是IndexOf(x)

然后,IndexOf()会返回一个整数,显示该值的docIds位置,OrderBy()可以在排序中使用该值。

哦,对。并且OrderBy()不会返回List,而是返回Enumerable,因此您最后需要ToList()。把这一切放在一起,你的最后一行应该是......

tileSizes = tileSizes.OrderBy(x => docsIds.IndexOf(x)).ToList();

答案 1 :(得分:0)

我通常喜欢手动做一些事情,所以有我的解决方案:

List<int> randomItems = new List<int>(){1,2,3,4,5,6,7};
List<int> outputOrder = new List<int>(){0,6,3,1,2,4,5};
List<int> resultList = new List<int>();

foreach(int order in outputOrder)
{
    resultList.Add(randomItems[order]);
}

编辑以复制OP值

resultList将包含:1,7,4,2,3,5,6

或者你可以像这样输出outputOrder:

List<int> outputOrder = new List<int>(){1,7,4,2,3,5,6};

并简单地将循环指令更改为:

resultList.Add(randomItems[order--]);

结果将是相同的。

答案 2 :(得分:0)

如果tileSizes不同且始终包含所有docsIds,则Union可用于O(n)复杂性:

tileSizes = docsIds.Union(tileSizes).ToList();        // { 1, 7, 4, 2, 3, 5, 6 }
相关问题