C# 循环遍历数组并查找部分字符串

C# 循环遍历数组并查找部分字符串,c#,arrays,string,C#,Arrays,String,如果我有数组 数组[0]=“插孔”; 数组[1]=“吉尔”; 数组[2]=“lisa”; 数组[2]=“jackie” 我想找到所有包含“ack”的元素 在这种情况下,它将返回 “杰克”,“杰基” 最快的方法是什么 array.Where(s => s.Contains("ack")); (愉快地忽略任何本地化/字符串排序/大小写敏感问题。)这应该比LINQ解决方案快一点 var list = new List<string>(); foreach(string s in a

如果我有数组

数组[0]=“插孔”; 数组[1]=“吉尔”; 数组[2]=“lisa”; 数组[2]=“jackie”

我想找到所有包含“ack”的元素

在这种情况下,它将返回

“杰克”,“杰基”

最快的方法是什么

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

(愉快地忽略任何本地化/字符串排序/大小写敏感问题。)

这应该比LINQ解决方案快一点

var list = new List<string>();
foreach(string s in array)
{
    if ((s ?? "").Contains("ack"))
    {
        list.Add(s);
    }
}
var list=newlist();
foreach(数组中的字符串s)
{
如果((s??)。包含(“确认”)
{
列表。添加(s);
}
}
我真的不懂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

几乎肯定包含bug。

我认为这应该比LINQ解决方案更快

IEnumerable<string> Containing(string[] xs, string sub) {
  foreach(string s in array)
  if (s.Contains(sub))
    yield return s;
}
IEnumerable包含(string[]xs,string sub){
foreach(数组中的字符串s)
如果(s.包含(子))
收益率;
}

我假设
xs

中没有空字符串,您确定要最快的还是最简单的?另外,在现实世界中,数组中将包含多少字符串?在包含特定子字符串的数组中查找所有元素的次数是多少?您的单词数组始终相同,还是子字符串始终相同?如果你真的想要最快的,这些问题的答案将提示不同的解决方案。使用String.Empty而不是“”可能会使它更快一些。我不认为会有任何明显的速度差异——LINQ Where运算符产生几乎完全相同的代码,只需添加一个迭代器类来处理延迟枚举。不过,处理空值的技巧很好!那要看情况了。有些人认为剃须微秒是一件好事。尽管值得注意的是,我蹩脚的标杆测试表明它比LINQ方法快,有人知道为什么吗?我在LINQ:array中使用了以下内容。Where(s=>s.Contains(“ack”)).ToList()使用Where创建了一个名为whererrayiterator的类,该类在我在这里编写的内容上添加了一层抽象。是否有任何方法使这个案例变得不敏感?这并不重要,但我的原始答案与此相同,但包含了.ToLower()(或s.IndexOf(“ack”,StringComparison.OrdinalIgnoreCase)>=0。将IndexOf>=0与StringComparison一起使用的好处是,它允许您控制比较是顺序的还是区域性的(例如,如果字符串包含重音大写字母a,它是否与“ack”的“a”匹配)。我想你可能不需要编写自己的Contains方法。如果你觉得现在发布这个有点傻的话。也许我应该把C#问题留给C#专家。看起来像是VB、C、JavaScript的混合体。非常有趣。可惜他们没有提供理由。我不认为这需要收益率。不管怎样,他们很可能会调用。ToArray()。