【问题标题】:Sorting a list of mixed integers and strings对混合整数和字符串的列表进行排序
【发布时间】:2014-06-03 08:57:50
【问题描述】:

当我使用排序时,我有一个包含混合数字和字符串的数据列表

var list = thelist.OrderBy(p=>p.ColumnWithValues)

我会按以下顺序获得结果:

> 1, 1 item, 10, 2, 3, 4, 5, a, another 1, b

但我希望它们按以下顺序排列:

> 1, 2, 3, 4, 5, 10, 1 item,a, another 1, b

我该怎么做呢?我什至不确定如何使用多个属性的列表来尝试

更新:

我已经修复了我的示例数据,我想要做的事情可能吗?

【问题讨论】:

  • “另一个 1”从何而来?
  • 为什么1 item 会从所需的输出中消失?
  • @Matthew 这叫做魔法排序

标签: c# sorting alphanumeric


【解决方案1】:

你应该先按类型排序:

var list = thelist.OrderBy(p=> p.GetType() == typeof(string)).ThenBy(p => p)

【讨论】:

    【解决方案2】:

    也试试这个。

    var thelist = new[] {"1", "item", "10", "2", "3", "4", "5", "a", "b", "c"};
            var list = thelist.Where( num => num.All( x => char.IsDigit( x ) ) )
                      .OrderBy( r => { int z; int.TryParse( r, out z ); return z; } )
                      .Union( thelist.Where( str => str.All( x => !char.IsDigit( x ) ) )
                      .OrderBy( q => q ) );
    
             foreach (var i in list)
                {
                    Console.WriteLine(i.ToString());
    
                }
    

    这是要检查的.net fiddle...

    【讨论】:

      【解决方案3】:

      通过编写一个包含使用IComparer的类来解决

      通过使用实现:

      thelist.OrderBy(p => p.ColumnWithValues, new OrdinalStringComparer());
      

      【讨论】:

        【解决方案4】:
        var list = thelist.OrderBy(p=> p.GetType() == typeof(string)).ThenBy(p => p)
        

        以上对我来说确实有效。

        Actual list = { "(unknown)", "(unknown)", "(unknown)", 
                        "183", "so", "Mo", "170", "Opps" , "(unknown)" }
        Expected list = { "(unknown)", "(unknown)", "(unknown)", 
                          "(unknown)", "170","183", "Mo" ,"Opps", "so" }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-30
          • 1970-01-01
          • 2013-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多