2009-10-19 99 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