在不同的特定字符之前返回单词
本文关键字:返回 单词 字符 | 更新日期: 2023-09-27 18:00:14
我有以下代码,它获取comma
之前的单词。
static string GetString(string input)
{
try
{
return input.Substring(0, input.IndexOf(','));
}
catch
{
return string.Empty;
}
}
示例:
输入:Lennon,John
结果:Lennon
问题是我需要指定多个字符;而不仅仅是CCD_ 2。
例如:我需要获取以下单词之前的所有单词:,([!
我该怎么做?
改为使用IndexOfAny
,它允许您指定一个字符数组:
return input.Substring(0, input.IndexOfAny(new[] { ',', '(', '[', '!' }));
我还建议您不需要try / catch
块,因为它用于捕获异常,而这并不是真正的"异常"情况。
var index = input.IndexOfAny(new[] { ',', '(', '[', '!' });
return index > -1 ? input.Substring(0, index) : string.Empty;
您可以使用字符串。IndexOfAny类似于IndexOf
,但需要一个字符数组来匹配:
static string GetString(string input)
{
try
{
return input.Substring(0, input.IndexOfAny(new [] { ',', '(', '[', '!' }));
}
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;
}
}
第一个循环在241毫秒内执行100万次,第二个循环在5300毫秒内执行10万次(在我的机器上,YMMV)
您可以使用正则表达式或字符串。分裂我更喜欢使用字符串split。正则表达式会过大。
代码如下所示:string[]inputSplit=输入。Split(new[]{",","(","[","!"},StringSplitOptions.None);