c# - 首先按字母值对列表排序,然后按数值排序

标签 c# linq

class ListSort
{
    static void Main(string[] args)
    {
        string[] partNumbers = new string[] 
        { 
           "India", "US","UK", "Australia","Germany", "1", "7", "9" 
        };
        var result = partNumbers.OrderBy(x => x).ToList();                    
    }
}

我尝试了上面的代码,并期望得到以下输出:

Australia
Germany
India
UK
US
1
7
9 

编辑: 数字应该按数字排序(1、7、9、70,...),而非数字应该始终按词汇排序,即使里面有数字(“A3stralia”、“澳大利亚”、“德国”)。

最佳答案

试试这个:

string[] partNumbers = new string[] 
  { 
    "India", "US","UK", "Australia","Germany", "1", "7", "9" 
  };

var result = partNumbers.OrderBy(x => char.IsNumber(x.FirstOrDefault())).ThenBy(x => x).ToList().Dump();

请注意,这仅在您的数据是数字或文本时才有效,如果存在诸如“U2S”之类的值,则无效。不过,如果您需要的话,我也可以将其更改为适用于那些情况。此外,数字字符串仍按字符串排序,因此“10”位于“2”之前。

当您将 A3stralia70 添加到列表时,您希望结果如何?

编辑:针对新约束进行了更改:

string[] partNumbers = new string[] 
  { 
      "India", "US","UK", "Australia","Germany", "1", "7", "9", "70", "A3stralia" 
  };

var result = 
    partNumbers
        .Select(x => { int p; bool isNumber = int.TryParse(x, out p);  return new { IsNumber = isNumber, NumericValue = isNumber ? p : int.MinValue, StringValue = x }; })
        .OrderBy(x => x.IsNumber)
        .ThenBy(x => x.NumericValue)
        .ThenBy(x => x.StringValue)
        .Select(x => x.StringValue)
        .ToList();

关于c# - 首先按字母值对列表排序,然后按数值排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20465822/

相关文章:

c# - 使用条件断点时,Visual Studio 会减慢执行速度

c# - 如何编写 C# 方法来清除按钮单击时的一组复选框?

c# - 应用程序中的 Visual C# "Settings Editor"?

c# - Linq OrderBy 子列表

c# - 先按大写字母排序

c# - 如何使用 LINQ 将列表垂直拆分为 n 个部分

c# - 检查字符串是否不等于某物

c# - 用 0 到 9 的数字填充字符串并开始新的直到长度为 50

c# - 如何比较日期时间(仅 dd/mm/yyyy hh :mm:ss tt not whole fff section in datetime) in linq C#?

c# - groupby 内部 groupby 和 All() 性能