-2

我有这个分句

if ((line.Contains('%')) || (line.Contains('@')) || (line.Contains("") && (!line.Contains(','))))

我想将它重写为一种方法,因为这太慢了。有任何想法吗??

4

3 回答 3

9
if(line.Intersect("%@,").Any())

或者

if("%@,".Intersect(line).Any())

(反转参数可能会提高性能,具体取决于数据类型line和匹配字符的百分比。)

于 2013-04-22T15:54:11.167 回答
3

其他两个答案似乎都忽略了原始代码在line包含%包含@时返回 true 的事实。(空字符串完全不相关)。,

正确的写法是:

if(line.Intersect("%@").Any() || !line.Contains(","))

或者可能:

char[] includes = { '%', '@' };
char[] excludes = { ',' };
if(line.Intersect(includes).Any() || !line.Intersect(excludes).Any())

或这个:

char[] includes = { '%', '@' };
char[] excludes = { ',' };
if(line.IndexOfAny(includes) != -1 || line.IndexOfAny(excludes) == -1)
于 2013-04-22T16:08:01.677 回答
1

首先,让我们简化整个语句。你使用了很多钩子:

if (line.Contains('%') || line.Contains('@') || line.Contains("") && !line.Contains(','))

其次,如前所述,line.Contains("") 将始终返回 true。也许你错过了一个空间或其他东西。

最后,在一个字符串(或一个字符数组)中搜索一个字符的 orrucance 非常快!整个搜索操作只是汇编级别的一项简单操作(REP SCASW)。在这种情况下,您必须搜索不止一次的字符,这将产生一个或多个简单的汇编指令。C# 中的其他语句可能更短,但可能不会更快。

在字符串中搜索字符串稍微慢一些,因此请尝试删除 Contains("")。

其他操作(使用 LINQ 或 REGEX)可能会导致更多:内存操作(用于数组、委托、结果类型)、更多分析(字符数组中的多个字符)等。

于 2013-04-22T16:08:18.797 回答