C# 如何有效地确定字符串是否以数字开头,然后获取所有后续数字直到第一个非数字字符?

C# 如何有效地确定字符串是否以数字开头,然后获取所有后续数字直到第一个非数字字符?,c#,string,C#,String,我需要对一些包含以下数据的字符串进行排序: var strings = new List<string>{"2009 Arrears","2008 Arrears","2008 Arrears Interest","2009 Arrears Interest"}; var strings=新列表{“2009年欠款”、“2008年欠款”、“2008年欠款利息”、“2009年欠款利息”}; 他们希望结果按如下顺序排列: var strings = new List<string

我需要对一些包含以下数据的字符串进行排序:

var strings = new List<string>{"2009 Arrears","2008 Arrears","2008 Arrears Interest","2009 Arrears Interest"};
var strings=新列表{“2009年欠款”、“2008年欠款”、“2008年欠款利息”、“2009年欠款利息”};
他们希望结果按如下顺序排列:

var strings = new List<string>{"2009 Arrears","2008 Arrears","2008 Arrears Interest","2009 Arrears Interest"};
  • “2009年欠款”
  • “2009年拖欠利息”
  • “2008年欠款”
  • “2008年拖欠利息”

  • 似乎我需要创建一个函数来查看字符串是否以数字开头。如果是这样,函数将获取直到第一个字符的所有数字,并对数值结果进行降序排序,然后对其余字符进行升序排序。我在尝试编写一个方法来获取字符串中的所有起始数字时遇到困难。什么是一种有效的方法呢?

    正则表达式可以很好地将其拆分:

    var match = Regex.Match(text, @"^(\d+) (.*)$");
    
    然后
    match.Groups[0]。Value
    是年份,
    match.Groups[1]。Value
    是标题(“欠款”、“欠款利息”等)

    您可以使用LINQ应用排序(年份递减、标题递增):

    正则表达式可能不是最快的解决方案;这里有一个与LINQ保持良好清洁的替代方案:

    var sortedTitles =
        from title in titles
        let year = new string(title.TakeWhile(ch => char.IsDigit(ch)).ToArray())
        let remainder = title.Substring(year.Length).Trim()
        orderby year descending, remainder
        select title;
    
    public int GetLeadingNumber(字符串输入)
    {
    char[]chars=input.ToCharArray();
    int lastValid=-1;
    for(int i=0;i=0)
    {
    返回int.Parse(新字符串(chars,0,lastValid+1));
    }
    其他的
    {
    返回-1;
    }
    }
    

    尽管严格来说,这是最有效的,但其他海报提供的正则表达式解决方案显然更简洁、更清晰,具体取决于您对字符串的处理程度。

    注意,此表达式要求数字后面加空格(除非使用
    IgnoreWhitespace
    选项创建/调用正则表达式)。是的——我假设空格是字符串的保证元素。我知道它是一个非常晚的修饰符,但由于使用贪婪的\d+,所以可以只在空格后面加上“?”,因此这不是强制性的。如果起始数字是最近一年的话,也可以这样做(实际上高于1000),出于性能原因,请使用“^(\d{4})(.*)$”(如果您说搜索四位数字,引擎会更快。但是您必须准备好在开始日期出现错误的字符串。无论如何,您都应该这样做)您可能对以下内容感兴趣:
    public int GetLeadingNumber(string input)
    {
        char[] chars = input.ToCharArray();
        int lastValid = -1;
    
        for(int i = 0; i < chars.Length; i++)
        {
            if(Char.IsDigit(chars[i]))
            {
                lastValid = i;
            }
            else
            {
                break;
            }
        }
    
        if(lastValid >= 0)
        {
            return int.Parse(new string(chars, 0, lastValid + 1));
        }
        else
        {
            return -1;
        }
    }