2013-04-22 66 views
-2

我有這個clausule重寫contains()方法C#

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

,我希望它重寫一個方法,這東陽是太慢了。有任何想法嗎??

+0

[你有什麼嘗試?](http://whathaveyoutried.com) – 2013-04-22 15:52:21

+11

'line.Contains(「」)'!? – 2013-04-22 15:52:35

+1

'line.Contains(「」)'將始終返回true。它甚至可以在[documentation](http://msdn.microsoft.com/en-us/library/dy85x1sa.aspx)中這樣說。 – 2013-04-22 15:52:54

回答

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) 
9
if(line.Intersect("%@,").Any()) 

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

(倒車參數可以提高性能,這取決於數據的line類型和匹配字符的百分比。)

+0

+1我一直是忍者'd – phadaphunk 2013-04-22 15:54:28

+0

我只是試圖發佈這個,但是顯然現在使用更快的手指檢測到人! +1 – spender 2013-04-22 15:54:59

+0

不確定這會比他擁有的快。 (雖然我同意它可能不需要)。除非他的意思是打字速度更快。 – 2013-04-22 15:55:43

1

首先,讓我們簡化整個語句。您可以使用到許多掛鉤:

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

其次,如前所述,line.Contains( 「」)將始終返回true。你錯過了一個空間或其他東西。

最後,搜索一個字符串(或一個字符數組)是爲了快速!整個搜索操作只是彙編級別的一個簡單操作(REP SCASW)。在這種情況下,您必須搜索多個字符,這會導致一個或多個簡單的彙編指令。 C#中的其他語句比較短,但可能不會更快。

搜索字符串內的字符串會稍微慢一點,所以請嘗試刪除Contains(「」)。

其它操作(與LINQ或正則表達式)可能會導致成更:存儲器操作(用於數組,代表,結果類型),更實證分析(字符數組內的多個字符),等等,等等