【问题标题】:C# orderby string along with int [duplicate]C# orderby 字符串和 int [重复]
【发布时间】:2017-03-25 06:49:44
【问题描述】:

我有一个包含字符串和数字数据的列表。我必须按升序和降序对其进行排序。

        id    data
    ------------------
        1     data1@%
        2     data10
        3     data
        4     @$data
        5     data2

我获取记录并将其存储在列表“列表”中。然后我按升序排序,但“data10”以黑白“data1”和“data2”的形式出现。下面是我的代码

var o/p = List.OrderBy(x => x.data);

expected output - data1, data2 and data10

【问题讨论】:

  • 按 id 排序
  • 是的,这是字典排序。
  • 我假设您的代码实际上不包含var o/p = ...
  • 我只需要取数据列
  • 您期待什么结果? (该字段是 string 并且正在正确排序)

标签: c# linq


【解决方案1】:

您当前正在根据字符串值对其进行排序,这将按字典值对其进行排序。在字典中,“10”将出现在“1”和“2”之间,因为这是按字母顺序排列的 - 它无法识别它是在对数字进行排序。

真正的字母数字排序可能会非常复杂,但根据您的数据,您或许可以对其进行简化。假设您的字符串“data1”、“data2”和“data10”是一致的模式,您可以这样做:

var op = List.OrderBy(x => int.Parse(x.data.substring(4)));

或者,如果数字之前的值不是恒定长度,您可以使用正则表达式将数字值拉出来:

var op = List.OrderBy(x => int.Parse(Regex.Match(x.data, "\\d+").Value));

【讨论】:

  • 如果我把 orderbydescending,上面的工作正常
  • “正则表达式”中显示错误
  • 你有using System.Text.RegularExpressions;吗?
  • 添加包后问题已修复。
【解决方案2】:

为了得到你想要的,你需要在你的 order by 子句中填充数字部分,比如:

var o/p = List.OrderBy(x => PadNumbers(x.Data));

其中 PadNumbers 可以定义为 StackOverflow 用户 Nathan 写了 here

public static string PadNumbers(string input)
{
    return Regex.Replace(input, "[0-9]+", match => match.Value.PadLeft(10, '0'));
}

这将为出现在输入字符串中的任何数字(或多个数字)填充零,以便 OrderBy 看到:

data0000000001
data0000000010
data0000000002

填充仅发生在用于比较的键上。结果中保留了原始字符串(没有填充)。

注意:此方法假定输入中数字的最大位数。

【讨论】:

  • 你能解释一下上面的代码fn吗
  • 填充解决方案只是移动问题而不是删除它。在任何情况下都可以将数字部分转换为整数。无需注意最大位数。
  • 请不要把其他用户的解决方案当成你自己的。
猜你喜欢
  • 1970-01-01
  • 2013-09-14
  • 2017-01-05
  • 1970-01-01
  • 2011-05-25
  • 2019-10-24
  • 2012-10-06
  • 2020-11-05
  • 2013-12-08
相关资源
最近更新 更多