我有一个字符串,如下所示:
<1>something here just not relevant</1>
我需要最快的方法才能拿到1号。
我的尝试:
int signature=Convert.ToInt32(data.Split('
string str = "<1>something here just not relevant</1>";
result = int.Parse(str.Substring(1, str.IndexOf('>') - 1));
这应该比正则表达式快,并且只要您能确定字符串的第一个字符是开始的尖括号(而不是空格或前一个标记)就可以工作。如果您不能确定这一点,请使用第二个IndexOf
:
string str = "<1>something here just not relevant</1>";
var start = str.IndexOf('<')+1;
result = int.Parse(str.Substring(start, str.IndexOf('>') - start));
正则表达式匹配会更可靠、更干净,但速度稍慢:
string str = "<1>something here just not relevant</1>";
result = int.Parse(Regex.Match(str, "<(\d+)>").Captures[0]);
只是为了好玩和出奇的快:
public static int GetSignature(string value)
{
int result = 0;
for (int i = 1; i < 12; i++) // 12 should be more than enough for Int32
{
if (value[i] == '>')
{
break;
}
result = (result * 10) + (value[i] - '0');
}
return result;
}
编辑:我的快速测试设置
class Program
{
static void Main(string[] args)
{
Run(new Random());
Console.ReadLine();
}
private static void Run(Random rnd)
{
var counts = new[] { 10, 100000, 10000000 };
foreach (var count in counts)
{
Console.WriteLine(count);
Run(count, rnd);
Console.WriteLine();
}
}
private static void Run(int count, Random rnd)
{
var values = GetValues(count, rnd);
var funcs
= new Dictionary<string, Func<string, int>>
{
{"OP", GetSignatureOP},
{"Keith", GetSignatureKeith},
{"Fun", GetSignatureFun},
};
foreach (var kvp in funcs)
{
TimeSpan elapsed;
Test(values, kvp.Value, out elapsed);
Console.WriteLine("{0,-5}: {1:G}", kvp.Key, elapsed);
}
}
private static IList<string> GetValues(int count, Random rnd)
{
var result = new List<string>(count);
for (int index = 0; index < count; index++)
{
result.Add(string.Format("<{0}>something here just not relevant</{0}>", rnd.Next(1, 10)));
}
return result;
}
private static int Test(IEnumerable<string> values, Func<string, int> func, out TimeSpan elapsed)
{
GC.Collect();
GC.WaitForPendingFinalizers();
var sw = Stopwatch.StartNew();
var count = values.Aggregate(0, (current, value) => current ^ func(value));
sw.Stop();
elapsed = sw.Elapsed;
return count;
}
private static int GetSignatureOP(string value)
{
return Convert.ToInt32(value.Split('>')[0].Remove(0, 1));
}
private static int GetSignatureKeith(string value)
{
return int.Parse(value.Substring(1, value.IndexOf('>') - 1));
}
private static int GetSignatureFun(string value)
{
int result = 0;
for (int i = 1; i < 12; i++)
{
if (value[i] == '>')
{
break;
}
result = (result * 10) + (value[i] - '0');
}
return result;
}
}
结果(在我的机器上):
10
OP : 0:00:00:00,0007532
Keith: 0:00:00:00,0001523
Fun : 0:00:00:00,0001307
100000
OP : 0:00:00:00,0306495
Keith: 0:00:00:00,0116116
Fun : 0:00:00:00,0018416
10000000
OP : 0:00:00:02,7450986
Keith: 0:00:00:01,1598363
Fun : 0:00:00:00,1855654
并带有 rnd 的随机值。下一页(1, int.最大值)
:
10
OP : 0:00:00:00,0006975
Keith: 0:00:00:00,0001147
Fun : 0:00:00:00,0001246
100000
OP : 0:00:00:00,0409755
Keith: 0:00:00:00,0187789
Fun : 0:00:00:00,0030894
10000000
OP : 0:00:00:04,0060685
Keith: 0:00:00:01,9214684
Fun : 0:00:00:00,3083399
问题内容: 我有一个像这样的字符串: 我想拆分该字符串并选择作为分隔符。 我的代码如下所示: 我得到的是一个包含所有字符作为一个条目的数组: 有人知道为什么吗? 我不能用分割字符串吗? 问题答案: 在RegEx中被视为。因此,您需要对其进行转义:
问题内容: 如何在定界符哪里分割此字符串 获得?的输出 问题答案: 你可以使用以下功能:
问题内容: 我有一个字符串,例如“ 600sp”,我希望从中获得整数部分(600)。 如果我这样做,由于字符串中遇到非数字值“ s”,我将收到异常。 抓住整数部分的最快最干净方法是什么? 谢谢! 问题答案: 如果您的字符串格式始终是数字后跟一些字符,请尝试执行此操作
在字符串中分隔符的最后一次出现时拆分字符串的推荐Python习惯用法是什么?例如: 接受第二个参数,该参数是要拆分的分隔符的引用。与常规列表索引一样,表示从末尾开始的最后一个。如何做到这一点?
问题内容: 对于在字符串中 最后一次 出现定界符时拆分字符串的建议Python惯用法是什么?例: 接受第二个参数,即要分割的分隔符的出现。像常规列表索引一样,表示末尾的末尾。如何才能做到这一点? 问题答案: 使用 或代替: 可让您指定分割次数,而仅分割一次,但总是返回固定数量的元素(前缀,定界符和后缀),并且对于单个分割情况而言更快。 演示: 两种方法都从字符串的右侧开始拆分;通过将最大值作为第二
问题内容: 我有以下字符串; 等级,用户名和消息的字符每次都不同。将其分为三个独立变量(用户名,等级和消息)的最佳方法是什么? 我已经尝试过: 但这会抛出错误。提前致谢! 问题答案: 使用Java对正则表达式()的支持,并让正则表达式匹配这三个部分。 例如这个: Java代码段,略微改编自Ian F. Darwin的“ Java Cookbook”(O’Reilly): 输出: