C# 返回不同特定字符前的单词
我有下面的代码,它获取逗号前面的单词C# 返回不同特定字符前的单词,c#,C#,我有下面的代码,它获取逗号前面的单词 static string GetString(string input) { try { return input.Substring(0, input.IndexOf(',')); } catch { return string.Empty; } } 例如: 输入:列侬,约翰 结果:列侬 问题是我需要指定多个字符;不仅仅是逗号 static string GetString
static string GetString(string input)
{
try
{
return input.Substring(0, input.IndexOf(','));
}
catch
{
return string.Empty;
}
}
例如:
输入:列侬,约翰
结果:列侬
问题是我需要指定多个字符;不仅仅是逗号
static string GetString(string input)
{
try
{
return input.Substring(0, input.IndexOf(','));
}
catch
{
return string.Empty;
}
}
例如:我需要获取以下内容之前的所有单词:,([!
我如何做到这一点?使用
但是,我更愿意在您的方法中添加一个安全网,并且不要依赖异常来驱动代码流
static string GetString(string input)
{
int pos = input.IndexOfAny(new char[] {',','(', '[', '!'});
return (pos >= 0 ? input.Substring(0, pos) : string.Empty;
}
使用异常来控制代码流是一种不好的做法。异常在性能方面非常昂贵。在您的情况下,我建议将代码分成两行,如果字符根本不存在,则测试返回指定输出的结果
为了演示最坏情况下的差异:
void Main()
{
string input = "test";
string result;
Stopwatch sw = new Stopwatch();
sw.Start();
for(int x = 0; x < 1000000; x++)
result = GetString(input);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw = new Stopwatch();
sw.Start();
for(int x = 0; x < 100000; x++)
result = GetString2(input);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
string GetString(string input)
{
int pos = input.IndexOfAny(new char[] {',','(', '[', '!'});
return (pos >= 0 ? input.Substring(0, pos) : string.Empty);
}
string GetString2(string input)
{
try
{
return input.Substring(0, input.IndexOfAny(new [] { ',', '(', '[', '!' }));
}
catch
{
return string.Empty;
}
}
void Main()
{
字符串输入=“测试”;
字符串结果;
秒表sw=新秒表();
sw.Start();
对于(int x=0;x<1000000;x++)
结果=GetString(输入);
sw.Stop();
控制台写入线(软件延迟毫秒);
sw=新秒表();
sw.Start();
对于(int x=0;x<100000;x++)
结果=GetString2(输入);
sw.Stop();
控制台写入线(软件延迟毫秒);
}
字符串GetString(字符串输入)
{
int pos=input.IndexOfAny(新字符[]{',','(',[',!');
返回(位置>=0?输入。子字符串(0,位置):字符串。空);
}
字符串GetString2(字符串输入)
{
尝试
{
返回input.Substring(0,input.IndexOfAny(new[]{',','(','[','!'}));
}
抓住
{
返回字符串。空;
}
}
第一个循环在241毫秒内执行100万次,第二个循环在5300毫秒内执行十万次(在我的机器上,YMMV)改用
IndexOfAny
,它允许您指定字符数组:
return input.Substring(0, input.IndexOfAny(new[] { ',', '(', '[', '!' }));
我还建议您不需要使用try/catch
块,因为它用于捕获异常,这并不是真正的“异常”情况
var index = input.IndexOfAny(new[] { ',', '(', '[', '!' });
return index > -1 ? input.Substring(0, index) : string.Empty;
您可以使用类似于IndexOf但需要匹配字符数组的:
static string GetString(string input)
{
try
{
return input.Substring(0, input.IndexOfAny(new [] { ',', '(', '[', '!' }));
}
catch
{
return string.Empty;
}
}
您可以使用regex或string.Split。我更喜欢使用string.Split。regex的尺寸会过大 代码如下所示:
字符串[]inputSplit=input.Split(新的[]{“,”,“(“,“[”,“!”},StringSplitOptions.None)你能更具体一点吗?例如,如果输入是
列侬!约翰,杰克
输出应该是什么?空捕获…真不敢相信还会发生这种情况!@Selman22谢谢!基本上,我在寻找第一个单词,但我需要能够指定索引字符。在你的例子中,我只对列侬感兴趣。我正在处理的数据每个字符串中只包含一个字符。它可以是一个字符,也可以是另一个字符,但不能像您的示例那样同时包含两个字符。@UnaverageGuy-okey-thenIndexOfAny
是正确的选择。我只是想sure@UweKeim最糟糕的是,它被用来控制代码流,简单的if可以避免这样一个昂贵的异常,因为它不会使用试试Catch
。谢谢!