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

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

var strings = new List{"2009 Arrears","2008 Arrears","2008 Arrears Interest","2009 Arrears Interest"}; 

他们希望结果如下:

  1. “2009年欠款”
  2. “2009年拖欠利息”
  3. “2008年欠款”
  4. “2008年拖欠利息”

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

 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; } } 

虽然这绝对是最有效的,但其他海报提供的正则表达式解决方案显然更简洁,更清晰,具体取决于您对字符串的处理量。

一个正则表达式会很好地拆分它:

 var match = Regex.Match(text, @"^(\d+) (.*)$"); 

然后match.Groups[0].Value是年份, match.Groups[1].Value是标题(“欠款”,“拖欠利息”等)

您可以使用LINQ应用排序(年份降序,标题升序):

 string[] titles = new[] { "2008 Arrears", "2009 Arrears" }; var sortedTitles = from title in titles let match = Regex.Match(title, @"^(\d+) (.*)$") orderby match.Groups[0].Value descending, match.Groups[1].Value select title; listBox.ItemsSource = sortedTitles.ToArray(); // for example 

正则表达式可能不是最快的解决方案; 这是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;