【问题标题】:Sort a List<String[]> numerically对 List<String[]> 进行数字排序
【发布时间】:2013-05-25 10:16:24
【问题描述】:

我有一个List&lt;string[]&gt;。我添加了list.Add(new string[] {a, b, c, d}),其中d 是一串数字。

我想按数组第四个元素中的数字对列表进行数字排序。到目前为止,我只发现了这个:

list.Sort((s, t) => String.Compare(s[3], t[3]));

但这是按字母顺序排序的,所以 10 排在 2 前面,依此类推。

有没有同样简单的数字排序方式?

【问题讨论】:

  • 您如何将数据添加到此列表中?显示一些真实的代码行。
  • 另外,显示list的定义。
  • List list = new List();我从 Console.ReadLine() 中获取 a b c d 变量,将它们与 list.Add(new string[] {a,b,c,d}) 一起添加到列表中
  • 这似乎是一个自定义类比string[] 更好的选择。我认为你应该考虑改变这一点。
  • @svick 自定义类听起来更好。听起来内部数组实际上是某种数据结构。数组中的数组通常是灾难的根源,特别是对于以后维护此代码但不了解索引映射的任何人。

标签: c# arrays list sorting numerical


【解决方案1】:

如果你使用 linq,你可以这样做:

list = list.OrderBy(x => int.Parse(x[3])).ToList();

虽然这会创建一个新列表,但可能不会像直接排序列表那样高效。

【讨论】:

    【解决方案2】:

    这个呢?

    list.Sort((s, t) => int.Compare(int.Parse(s[3]), int.Parse(t[3])));
    

    或(如果列表全是数字,并且您希望结果为数字):

    list = list.Select(n => n.Select(x => int.Parse(x)).ToArray()).OrderBy(x => x[3]).ToList();
    

    (借口格式,在移动设备上)

    【讨论】:

      【解决方案3】:
      list.Sort((s, t) => System.Collections.Comparer.Default.Compare(Int32.Parse(s[3]), Int32.Parse(t[3])));
      

      我的建议是你应该用公共成员 a、b、c 和 d 真正实现你自己的类。然后您应该实现IComparable&lt;T&gt; 并在CompareTo() 方法中编写简单的比较逻辑。

      【讨论】:

      • 这个还有一个缺点就是不能按数字排序。它肯定不会使用与Int32 相关的任何内容。
      • @svick:你怎么猜?
      • 您为什么希望字符串的默认比较器按数字排序?它不会那样做。
      • @svick:啊,我的错。我认为第四个元素是int。感谢您指出。我已经更正了我的代码。
      • 详细信息仍然关闭。你说它不会在非数字条目上崩溃,它会。
      【解决方案4】:

      另一个解决方案(我在这里没有看到)是将委托实现为排序器

       // Split the string into individual number strings
       List<String> items  = wrongOrderBase.Split(DELIMITER).ToList<String>();
       items.Sort(delegate(String strA, String strB)
                  {
                      int intA = int.Parse(strA);
                      int intB = int.Parse(strB);
                      return intA.CompareTo(intB);
                  });
        // Re-join back into one string
        String sortedListString = String.Join(DELIMITER.ToString(), items);
      

      这样,如果您想做任何特殊情况的事情,您可以在委托中实现它。

      【讨论】:

        猜你喜欢
        • 2010-10-17
        • 1970-01-01
        • 2017-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-18
        • 1970-01-01
        • 2019-01-10
        相关资源
        最近更新 更多