我需要使用另一个列表对列表进行排序。 我正在尝试使用:
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
感谢任何帮助。
答案 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 }