C# 如何检查一个字符串是否包含在一个字符串数组中的任意一个元素

15

在C#中,检查一个字符串是否包含字符串数组中的任何匹配项的最快方法是什么?我可以使用循环来实现,但我认为这样做太慢了。


3
你认为这样会太慢,是因为做过测试吗?你的数据集通常有多大?像这样猜测只会浪费时间。 - Ed S.
你能澄清一下输入和期望结果吗? - Matthew Flaschen
它包含大约60个项目,但在同一个事件中我有更多的代码。性能还可以,但我只是想知道是否可以进行优化。 - dnclem
请查看以下链接:http://stackoverflow.com/questions/2930953/automatically-generating-regex-from-set-of-strings-residing-in-db-c/2931790#2931790。 - Oren Trutner
3
程序优化的第一条规则是:不要去做。程序优化的第二条规则(仅限专家使用)是:暂时也别去做。—— 迈克尔·杰克逊 (http://en.wikipedia.org/wiki/Program_optimization#Quotes) - Joe White
5个回答

27

使用 LINQ:

 return array.Any(s => s.Equals(myString))

当然,你可能需要考虑文化和情况,但这是一般的想法。 此外,如果 "matches" 不是指相等,你可以使用你需要用于“匹配”的函数。


1
更不用说:你仍在循环——只是在幕后进行。 - Dinah

17

我真的不能告诉你这是否绝对是最快的方法,但我通常会采用以下其中一种方式:

这将检查字符串是否包含数组中的任何字符串:

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()轻松地将其反转。

希望这可以帮到你!


很好,但如果您想以相反的方向执行检查怎么办...即检查该子字符串是否存在于数组项中。 - Dave Lawrence
非常感谢,这个简单的代码似乎可以工作,在我的水平下运行得相当快。不需要什么花哨的东西 :) - Juano

9

对我来说这很好:

string[] characters = new string[] { ".", ",", "'" };
bool contains = characters.Any(c => word.Contains(c));

1
在许多解决方案中,这是唯一一个在 ASP.NET Core 的 Where 语句中起作用的。 - Vahid Amiri

5
您可以使用正则表达式或语句来组合字符串,然后“一次性”完成,但从技术上讲,正则表达式仍在内部执行循环。最终,循环是必要的。

@david,即使是正则表达式也需要循环,我认为在大多数情况下它仍然比手动操作更快。此外,它有助于编写更清晰的代码,因此更容易维护,例如,您需要更改匹配条件。 - xandy
7
有些人遇到问题时会想:“我知道,我可以用正则表达式。” 现在他们有两个问题了。 - Barracoder

2
如果“数组”永远不会改变(或仅偶尔更改),并且您有许多输入字符串要对其进行测试,则可以从数组构建一个HashSet<string>。与循环的O(N)相比,HashSet<T>.Contains是一个O(1)操作。
但是,构建HashSet需要一些(小)时间。如果数组经常更改,则循环是唯一现实的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接