【问题标题】:Sort a list according to another list根据另一个列表对列表进行排序
【发布时间】:2018-11-15 02:28:42
【问题描述】:

我有一个这样的list1

{A,B,C,D,E,F}

我还有另一个list2 list2 count 等于 list1 count (6=6):

{50,100,14,57,48,94}

我想根据list2list1进行排序,即list2按升序排序。

{14,48,50,57,94,100}

结果:

{C,E,A,D,F,B}

我使用了以下代码。但是结果没有排序

list1= list1.OrderBy(d => list2.IndexOf(d)).ToList();

【问题讨论】:

  • 我读了两遍,我仍然不知道你在问什么。也许我错过了什么……
  • 你的两个列表中的元素是如何相互依赖的?
  • @HimBromBeere在另一个函数中,它们被赋值并相互依赖

标签: c#


【解决方案1】:

您可以使用Enumerable.Zip 组合它们,然后使用OrderBy 订购

对两个序列的对应元素应用一个指定的函数,产生一个结果序列。

var first = new List<char>() { 'A', 'B', 'C', 'D', 'E', 'F' };

var second = new List<double>() { 50, 100, 14, 57, 48, 94 };

var results = first.Zip(second, (f, s) => (first: f, second: s))
                   .OrderBy(x => x.second)
                   .Select(x => x.first);

Console.WriteLine(string.Join(", ", results ));

输出

C, E, A, D, F, B

【讨论】:

【解决方案2】:

试试这个:

docs = docs.OrderBy(d => docsIds.IndexOf(d.Id)).ToList();

应该给出预期的结果。

【讨论】:

    【解决方案3】:

    如果你使用数组而不是列表,你可以直接这样做:

    string[] list1 = 
    {
        "A", "B", "C", "D", "E", "F"
    };
    
    int[] list2 = 
    {
        50, 100, 14, 57, 48, 94
    };
    
    Array.Sort(list2, list1);
    
    Console.WriteLine(string.Join(", ", list1)); // C, E, A, D, F, B
    

    Array.Sort(Array keys, Array items) 方法正是为此目的而提供的。

    使用每个键的 IComparable 实现,根据第一个 Array 中的键对一对一维 Array 对象(一个包含键,另一个包含相应的项)进行排序。

    遗憾的是,List&lt;T&gt; 没有等价物。

    【讨论】:

      【解决方案4】:

      为什么不使用排序字典?

      var list1 = new List<int> { 50, 100, 14, 57, 48, 94 }
      var list2 = new List<string> { "A", "B", "C", "D", "E", "F" };
      var dict = new SortedDictionary<int, string>();
      
      for (int i = 0; i < list1.Count; i++)
      {
         dict.Add(list1[i], list2[i]);
      }
      

      您现在可以按正确的顺序访问这些值。

      【讨论】:

      • 与我的解决方案相当,但只需一步。肯定更好
      • @mm8 OP 不只是对列表进行排序,而是根据其他标准对其进行排序。另外,这允许他们稍后根据索引访问数据。
      【解决方案5】:

      试试这个:

      int index = 0;
      list1 = list1.OrderBy(d => list2[index++]).ToList();
      

      给定以下两个列表,它应该会产生预期的结果:

      List<string> list1 = new List<string> { "A", "B", "C", "D", "E", "F" };
      List<int> list2 = new List<int> { 50, 100, 14, 57, 48, 94 };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-01
        • 2021-05-02
        • 2011-03-22
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        • 2012-08-27
        相关资源
        最近更新 更多