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"};
似乎我需要创建一个函数来查看字符串是否以数字开头。如果是这样,函数将获取直到第一个字符的所有数字,并对数值结果进行降序排序,然后对其余字符进行升序排序。我在尝试编写一个方法来获取字符串中的所有起始数字时遇到困难。什么是一种有效的方法呢?正则表达式可以很好地将其拆分:
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;
}
}