如果我有數組循環遍歷數組並找到部分字符串
array [0] =「jack」; array [1] =「jill」; array [2] =「lisa」; array [2] =「jackie」;
我想找到所有帶有「ack」的元素。
在這種情況下,它將返回
「jack」,「jackie」。
這樣做的最快方法是什麼?
如果我有數組循環遍歷數組並找到部分字符串
array [0] =「jack」; array [1] =「jill」; array [2] =「lisa」; array [2] =「jackie」;
我想找到所有帶有「ack」的元素。
在這種情況下,它將返回
「jack」,「jackie」。
這樣做的最快方法是什麼?
array.Where(s => s.Contains("ack"));
(喜洋洋忽略任何本地化/字符串覈對/區分大小寫的問題。)
有無論如何使這種情況下不敏感 – leora 2009-10-19 01:33:16
s.ToLower()。當然包含(「ack」) – ChaosPandion 2009-10-19 01:44:32
:)。 。 。 。 – leora 2009-10-19 01:53:13
這應該是比LINQ解決方案快一點點。
var list = new List<string>();
foreach(string s in array)
{
if ((s ?? "").Contains("ack"))
{
list.Add(s);
}
}
使用String.Empty代替「」可能會使它更快一點 – 2009-10-19 01:28:02
我不認爲會有任何可觀的速度差異 - LINQ Where運算符導致幾乎完全相同的代碼,只是附加了一個迭代器類來處理延遲枚舉,雖然處理空值的方法很好! – itowlson 2009-10-19 01:37:55
這真的取決於某些人認爲縮短微秒是件好事 – ChaosPandion 2009-10-19 01:39:25
我真的不知道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
幾乎肯定包含錯誤。
我想你可能不需要編寫自己的Contains方法。如果覺得現在發佈這個有點傻。也許我應該將C#問題留給C#專家。 – Joel 2009-10-19 01:38:53
倒票。認爲可能會發生。我現在好悲傷。 – Joel 2009-10-19 01:47:24
看起來像VB,C,JavaScript的混合體。很有意思。 – ChaosPandion 2009-10-19 01:51:28
我相信這應該比LINQ解決方案更快。
IEnumerable<string> Containing(string[] xs, string sub) {
foreach(string s in array)
if (s.Contains(sub))
yield return s;
}
我假設在xs
中沒有空字符串。
我不認爲這需要收益率。可能性是他們會調用.ToArray()。 – ChaosPandion 2009-10-19 01:41:01
你確定你想要最快,還是你想*最簡單*?另外,真實世界中的數組中有多少個字符串?你會在數組中找到包含特定子字符串的所有元素多少次?你的單詞總是一致的,還是子字符串一直都是一樣的?如果你真的想要*最快*的話,這些問題的答案會提示不同的解決方案。 – 2009-10-19 01:17:34