我有以下代码在comma
之前得到了这个词。
static string GetString(string input)
{
try
{
return input.Substring(0, input.IndexOf(','));
}
catch
{
return string.Empty;
}
}
示例:
输入:Lennon,John
结果:列侬
问题是我需要指定多个字符;不只是comma
。
例如:我需要在以下内容之前获取所有单词:,([!
我该怎么做?
答案 0 :(得分:3)
改为使用IndexOfAny
,它允许您指定一个字符数组:
return input.Substring(0, input.IndexOfAny(new[] { ',', '(', '[', '!' }));
我还建议您不要使用try / catch
块,因为它曾用于捕获异常,而且这不是真正的"例外"情况。
var index = input.IndexOfAny(new[] { ',', '(', '[', '!' });
return index > -1 ? input.Substring(0, index) : string.Empty;
答案 1 :(得分:2)
但是,我更愿意在您的方法中添加一个安全网,而不是依赖异常来驱动代码流
static string GetString(string input)
{
int pos = input.IndexOfAny(new char[] {',','(', '[', '!'});
return (pos >= 0 ? input.Substring(0, pos) : string.Empty;
}
使用异常来控制代码流是一种不好的做法。在性能方面,例外是非常昂贵的。在你的情况下,我真的建议将代码分成两行并测试结果,如果字符根本不存在则返回desidered输出。
只是为了证明最坏情况下的差异:
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;
}
}
第一个循环在241毫秒内执行100万次,第二个循环在5300毫秒内执行十万次(在我的机器上,YMMV)
答案 2 :(得分:2)
您可以使用类似IndexOf
的{{3}},但需要匹配一系列字符:
static string GetString(string input)
{
try
{
return input.Substring(0, input.IndexOfAny(new [] { ',', '(', '[', '!' }));
}
catch
{
return string.Empty;
}
}
答案 3 :(得分:0)
您可以使用正则表达式或string.Split。我更喜欢使用string.split。正则表达式将超大。
代码如下: string [] inputSplit = input.Split(new [] {&#34;,&#34;,&#34;(&#34;,&#34; [&#34;,&#34;!&## 34;},StringSplitOptions.None);