2010-11-16 41 views
8

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

+3

为什么你认为这将是太慢?你测试过了吗?数据集的典型大小是多少?这样猜测是浪费时间。 – 2010-11-16 04:02:35

+0

你能澄清输入和期望的结果吗? – 2010-11-16 04:05:17

+0

它包含约60个项目,但在同一个事件中我有更多的代码。性能还行,但我只是想知道我是否可以优化它。 – david 2010-11-16 04:08:29

回答

4

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

+0

好吧,我已经做了一个循环然后。 – david 2010-11-16 04:05:20

+0

@david,即使正则表达式需要循环,我认为在大多数情况下,它仍然比手动更快。此外,它有助于更​​简洁的代码,因此更容易维护,例如,您需要更改匹配条件。 – xandy 2010-11-16 04:08:24

+4

有些人遇到问题时,认为 “我知道,我会用正则表达式。“现在他们有两个问题。 – 2012-01-09 17:41:24

19

使用LINQ:

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

当然,你可能要采取的文化和情况考虑进去,但这是一般的想法。 此外,如果平等不是您所说的“匹配”,您可以随时使用您需要用于“匹配”的功能。

+0

更何况:你还在循环 - 只是在幕后。 – Dinah 2010-11-16 04:13:04

1

如果“数组”不会改变(或者只是偶尔改变),并且您将有很多输入字符串用于测试,那么您可以从数组中构建一个HashSet<string>HashSet<T>.Contains是O(1)操作,而不是O(N)的循环。

但是,构建HashSet需要一些(少量)时间。如果数组会频繁变化,那么循环是唯一可行的方法。

7

我真的不能告诉你,如果这绝对是最快的方式,但是我也经常这样做的方法之一是:

这将检查如果字符串包含任何从数组中的字符串:

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.AnymyStrings.All

我不知道这是什么样的应用,但我经常需要使用:

if (myStrings.Any(checkThis.ToLowerInvariant().Contains)) 

所以,如果你检查,以查看用户的输入,都不会有问题,用户是否进入大写字母中的字符串,这可以通过使用ToLowerInvariant()很容易地反转。

希望这有助于!

+0

这很好,但是如果你想以相反的方向执行检查呢......即检查该子串是否存在于数组的项目中 – 2014-05-15 07:41:33

4

这对我来说工作得很好:

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

在许多解决方案中,这是唯一一个在Where语句中工作的人在ASP.NET核心。 – VSG24 2016-05-09 17:55:25

相关问题