【问题标题】:How can I Sort a List<int> using another List<int>?如何使用另一个 List<int> 对 List<int> 进行排序?
【发布时间】:2017-12-11 02:00:23
【问题描述】:

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

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

感谢任何帮助。

【问题讨论】:

标签: c# list sorting int


【解决方案1】:

假设tileSizes 仅具有从docIds 中选择的值(这似乎是意图,尽管问题有点不清楚),那么缺少的部分是IndexOf() 的参数,特别是IndexOf(x)

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

哦,对了。而OrderBy() 不返回List,而是返回Enumerable,所以最后需要ToList()。综上所述,你的最后一行应该是......

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

【讨论】:

    【解决方案2】:

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

    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 值

    结果列表将包含: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--]);
    

    结果是一样的。

    【讨论】:

    • 我知道这不是最有效的解决方案,但至少你可以设置一个断点,看看发生了什么并控制它。
    • 我认为OP希望根据 outputOrder 列表对结果列表进行排序,这意味着它应该是{1, 2, 14, 95, 45}
    • 如果列表没有相同数量的值怎么办?
    • @Camilo Terevinto 你可以随时编写代码(一个“如果”)来防止这种情况,并在这种情况下做任何你想做的事情。 IE 一些 throw 或错误处理
    • 这似乎是对 OP 提出的另一个问题的回答。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 2021-07-06
      • 2016-08-19
      • 2016-06-26
      相关资源
      最近更新 更多