c#重写Contains()方法

本文关键字:方法 Contains 重写 | 更新日期: 2023-09-27 18:10:17

我有这个条款

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

,我想把它重写成一个方法,因为这太慢了。有什么想法?

c#重写Contains()方法

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

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

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

其他两个答案似乎都忽略了这样一个事实,即当line包含%@或当NOT包含,时,原始代码返回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)

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

if (line.Contains('%') || line.Contains('@') || line.Contains("") && !line.Contains(','))
第二,如前所述,line.Contains(")将始终返回true。也许你漏了一个空格或什么。

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

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

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