2009-10-19 158 views
2

如果我有數組循環遍歷數組並找到部分字符串

array [0] =「jack」; array [1] =「jill」; array [2] =「lisa」; array [2] =「jackie」;

我想找到所有帶有「ack」的元素。

在這種情況下,它將返回

「jack」,「jackie」。

這樣做的最快方法是什麼?

+1

你確定你想要最快,還是你想*最簡單*?另外,真實世界中的數組中有多少個字符串?你會在數組中找到包含特定子字符串的所有元素多少次?你的單詞總是一致的,還是子字符串一直都是一樣的?如果你真的想要*最快*的話,這些問題的答案會提示不同的解決方案。 – 2009-10-19 01:17:34

回答

7
array.Where(s => s.Contains("ack")); 

(喜洋洋忽略任何本地化/字符串覈對/區分大小寫的問題。)

+0

有無論如何使這種情況下不敏感 – leora 2009-10-19 01:33:16

+1

s.ToLower()。當然包含(「ack」) – ChaosPandion 2009-10-19 01:44:32

+0

:)。 。 。 。 – leora 2009-10-19 01:53:13

1

這應該是比LINQ解決方案快一點點。

var list = new List<string>(); 
foreach(string s in array) 
{ 
    if ((s ?? "").Contains("ack")) 
    { 
     list.Add(s); 
    } 
} 
+0

使用String.Empty代替「」可能會使它更快一點 – 2009-10-19 01:28:02

+0

我不認爲會有任何可觀的速度差異 - LINQ Where運算符導致幾乎完全相同的代碼,只是附加了一個迭代器類來處理延遲枚舉,雖然處理空值的方法很好! – itowlson 2009-10-19 01:37:55

+0

這真的取決於某些人認爲縮短微秒是件好事 – ChaosPandion 2009-10-19 01:39:25

0

我真的不知道C#。這裏是僞代碼中的基本低級方法:

function boolean contains_string(string haystack, string needle) 
    int needleIndex 
    int haystackIndex 
    for haystackIndex from 0 to haystack.length-needle.length 
    for needleIndex from 0 to needle.length 
     if haystack[haystackIndex+needleIndex] != needle[needleIndex] 
     break 
     end if 
    end for 
    if needleIndex == needle.length-1 
     return TRUE 
    end if 
    end for 
    return FALSE 
end function 

for each element in array 
    if contains_string(element, "ack") 
    new_array.push element 
    end if 
end for 

幾乎肯定包含錯誤。

+0

我想你可能不需要編寫自己的Contains方法。如果覺得現在發佈這個有點傻。也許我應該將C#問題留給C#專家。 – Joel 2009-10-19 01:38:53

+0

倒票。認爲可能會發生。我現在好悲傷。 – Joel 2009-10-19 01:47:24

+1

看起來像VB,C,JavaScript的混合體。很有意思。 – ChaosPandion 2009-10-19 01:51:28

0

我相信這應該比LINQ解決方案更快。

IEnumerable<string> Containing(string[] xs, string sub) { 
    foreach(string s in array) 
    if (s.Contains(sub)) 
    yield return s; 
} 

我假設在xs中沒有空字符串。

+0

我不認爲這需要收益率。可能性是他們會調用.ToArray()。 – ChaosPandion 2009-10-19 01:41:01