C# 检查字符串是不是包含字符串数组中的任何匹配项
Posted
技术标签:
【中文标题】C# 检查字符串是不是包含字符串数组中的任何匹配项【英文标题】:C# Check if string contains any matches in a string arrayC# 检查字符串是否包含字符串数组中的任何匹配项 【发布时间】:2011-05-10 14:50:59 【问题描述】:在 C# 中检查字符串是否包含字符串数组中的任何匹配项的最快方法是什么?我可以使用循环来做到这一点,但我认为这太慢了。
【问题讨论】:
为什么你认为它会太慢?你测试过吗?您的数据集的典型大小是多少?这样的猜测是浪费时间。 你能澄清输入和期望的结果吗? 它包含大约 60 个项目,但在同一事件中,我有更多代码。性能还可以,但我只是想知道是否可以对此进行优化。 见***.com/questions/2930953/… “程序优化的第一条规则:不要这样做。程序优化的第二条规则(仅供专家使用!):不要这样做。” - 迈克尔 A. 杰克逊 (en.wikipedia.org/wiki/Program_optimization#Quotes) 【参考方案1】:使用 LINQ:
return array.Any(s => s.Equals(myString))
当然,您可能希望将文化和案例考虑在内,但这是大体思路。 此外,如果平等不是您所说的“匹配”,您可以随时使用您需要用于“匹配”的函数。
【讨论】:
更不用说:你还在循环播放——就在幕后。【参考方案2】:我真的不能告诉你这是否绝对是最快的方法,但我通常这样做的方法之一是:
这将检查字符串是否包含数组中的任何字符串:
string[] myStrings = "a", "b", "c" ;
string checkThis = "abc";
if (myStrings.Any(checkThis.Contains))
MessageBox.Show("checkThis contains a string from string array myStrings.");
要检查字符串是否包含数组的所有字符串(元素),只需将 if 语句中的 myStrings.Any
更改为 myStrings.All
。
不知道这是什么应用,但经常需要用到:
if (myStrings.Any(checkThis.ToLowerInvariant().Contains))
因此,如果您要查看用户输入,则无论用户是否输入大写字母的字符串都没有关系,这可以使用 ToLowerInvariant() 轻松反转。
希望这有帮助!
【讨论】:
这很好,但如果你想在相反的方向执行检查...即检查该子字符串是否存在于数组的项目中 非常感谢,简单且似乎可以工作,并且在我的水平上工作相当快。不需要任何花哨的东西:)【参考方案3】:这对我来说很好:
string[] characters = new string[] ".", ",", "'" ;
bool contains = characters.Any(c => word.Contains(c));
【讨论】:
在众多解决方案中,这是唯一一个在 ASP.NET Core 中的Where
语句中工作的解决方案。【参考方案4】:
您可以将字符串与正则表达式或语句组合,然后“一次性完成”,但从技术上讲,正则表达式仍会在内部执行循环。最终,循环是必要的。
【讨论】:
@david,即使正则表达式也需要循环,我认为在大多数情况下它仍然比手动执行要快。此外,它有助于更清晰的代码,因此更易于维护,例如,您需要更改匹配条件。 有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。【参考方案5】:如果“数组”永远不会改变(或很少改变),并且您将有很多输入字符串要针对它进行测试,那么您可以从数组中构建一个HashSet<string>
。 HashSet<T>.Contains
是一个 O(1) 的操作,而不是一个 O(N) 的循环。
但是构建 HashSet 需要一些(少量)时间。如果数组会频繁变化,那么循环是唯一可行的方法。
【讨论】:
以上是关于C# 检查字符串是不是包含字符串数组中的任何匹配项的主要内容,如果未能解决你的问题,请参考以下文章
如何检查字符串是不是与 node.js 中的任何正则表达式数组匹配?