【问题标题】:loop through an array and find partial string循环遍历数组并找到部分字符串
【发布时间】:2009-10-19 01:10:21
【问题描述】:

如果我有数组

数组[0] = "杰克"; 数组[1] = "吉尔"; 数组[2] = "丽莎"; 数组[2] = "杰基";

我想找到所有带有“ack”的元素。

在这种情况下它会返回

“杰克”,“杰基”。

最快的方法是什么?

【问题讨论】:

  • 您确定要最快,还是要最简单?此外,在现实世界中,您的数组中有多少个字符串?您将在数组中查找包含特定子字符串的所有元素多少次?您的单词数组是否始终相同,或者子字符串始终相同?如果您真的想要最快的解决方案,这些问题的答案将提示不同的解决方案。

标签: c# arrays string


【解决方案1】:
array.Where(s => s.Contains("ack"));

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

【讨论】:

  • 有没有办法让这个大小写不敏感
  • 没关系,但我的原始答案与此相同,但包含 .ToLower() 。 :(
  • Or s.IndexOf("ack", StringComparison.OrdinalIgnoreCase) >= 0。将 IndexOf >= 0 与 StringComparison 一起使用的好处是它允许您控制比较是序数还是文化- 尊重(例如,如果一个字符串包含重音大写 A,它会匹配“ack”的“a”吗?)。
【解决方案2】:

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

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

【讨论】:

  • 使用 String.Empty 而不是 "" 可能会更快
  • 我认为不会有任何明显的速度差异——LINQ Where 运算符产生几乎完全相同的代码,只是附加了一个迭代器类来处理延迟枚举。不过处理空值很好!
  • 这真的取决于。有些人认为剃须微秒是件好事。
  • 虽然值得一提的是,我糟糕的基准测试表明它比 LINQ 方法更快,但有人知道为什么吗?我对 LINQ 使用了以下内容:array.Where(s => s.Contains("ack")).ToList()
  • 使用 Where 创建了一个名为 WhereArrayIterator 的类,它为我在这里写的内容添加了一层抽象。
【解决方案3】:

我真的不懂 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# 专家。
  • 看起来像是 VB、C、JavaScript 的混合体。非常有趣。
  • 可惜他们没有提供理由。
【解决方案4】:

我相信这应该比 LINQ 解决方案更快。

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

我假设xs 中没有空字符串。

【讨论】:

  • 我不认为这需要收益。无论如何,他们很有可能会调用 .ToArray()。
猜你喜欢
  • 2023-03-23
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 2022-01-16
  • 2019-09-07
相关资源
最近更新 更多