【问题标题】:C# Sorting list by another listC#按另一个列表排序列表
【发布时间】:2012-10-31 05:13:28
【问题描述】:

我现在有 2 个列表:

list<string> names;
list<int> numbers;

我需要根据数字中的值对我的名字进行排序。 我一直在搜索,大多数都使用 x.ID 之类的东西,但我真的不知道那个值是什么。所以这没有用。

有谁知道,该怎么做,或者可以在 ID 部分帮助我吗?

【问题讨论】:

  • 为什么一个信息需要两个列表?请改用Dictionary&lt;int,string&gt;
  • @TimSchmelter 一个普通的Dictionary&lt;,&gt; 不会按键排序(它使用哈希码)。听起来更像是SortedDictionary&lt;int, string&gt;SortedList&lt;int, string&gt;。我提供了一个答案,描述了如何将两个列表转换成那个。

标签: c# sorting


【解决方案1】:

所以我假设两个列表中的元素通过索引相关。

names.Select((n, index) => new { Name = n, Index = index })
     .OrderBy(x => numbers.ElementAtOrDefault(x.Index))
     .Select(x => x.Name)
     .ToList();

但如果两个列表都相关,我会使用另一种集合类型,例如 Dictionary&lt;int,string&gt;

【讨论】:

    【解决方案2】:

    也许这是Zip 方法的任务。类似的东西

    names.Zip(numbers, (name, number) => new { name, number, })
    

    将两个序列“压缩”为一个。从那里您可以立即订购序列,例如

    .OrderBy(a => a.number)
    

    或者你也可以创建一个Dictionary&lt;,&gt;,比如

    .ToDictionary(a => a.number, a => a.name)
    

    但听起来你真正想要的是 SortedDictionary&lt;,&gt;,而不是由哈希码组织的 Dictionary&lt;,&gt;。没有用于创建排序字典的 LINQ 方法,只是说

    var sorted = new SortedDictionary<int, string>();
    foreach (var a in zipResultSequence)
        sorted.Add(a.number, a.name);
    

    或者,使用SortedDictionary&lt;,&gt;,完全跳过 Linq,像这样:

    var sorted = new SortedDictionary<int, string>();
    for (int idx = 0; idx < numbers.Count; ++idx)  // supposing the two list have same Count
        sorted.Add(numbers[idx], names[idx]);
    

    【讨论】:

      【解决方案3】:

      为了补充 Tims 的答案,您还可以使用自定义数据结构将一个名称与一个数字相关联。

      public class Person
      {
          public int Number { get; set; }   // in this case you could also name it ID
          public string Name { get; set; }
      }
      

      然后你会有一个List&lt;Person&gt; persons;,你可以根据你喜欢的任何属性对这个列表进行排序:

      List<Person> persons = new List<Person>();
      persons.Add(new Person(){Number = 10, Name = "John Doe"});
      persons.Add(new Person(){Number = 3, Name = "Max Muster"});
      
      // sort by number
      persons = persons.OrderBy(p=>p.Number).ToList();
      
      // alternative sorting method
      persons.Sort((a,b) => a.Number-b.Number);
      

      【讨论】:

      • 谢谢,但是字符串列表,其实已经是一个类了,但是为了方便提问我把它改成了一个字符串^^
      【解决方案4】:

      我用字典修复了它,结果如下:

      dictionary.OrderBy(kv => kv.Value).Reverse().Select(kv => kv.Key).ToList();
      

      【讨论】:

      • 使用OrderByDescending而不是在订购后反转。
      猜你喜欢
      • 2021-03-10
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      相关资源
      最近更新 更多