2011-11-07 99 views
3

我想实现一个简单的搜索功能。我有一个字符串数组,其中包含从用户输入的所有单词以供搜索。我有另一个字符串,其中包含用户名,内容等数据...所以我想要做的是检查是否包含搜索或字符串数​​组中的任何元素。现在我有一个循环,每次检查一个单词并将结果连接到一个IEnumerable中。C#如何检查一个字符串是否包含字符串数组中的任何元素?

有没有人知道一个更快的方式来做这个搜索?像String.ContainsAny(搜索[])

感谢

+0

这是阵列预排序,我们确实是有意义的,你的情况?这将改变“最佳”算法。 –

+0

它的随机性,所以搜索可以搜索= [“管理”,“你好”],我必须搜索一个字符串=“这是我的帖子,你好”。 – user1034489

+0

没有任何种类的排序,比我不知道任何比简单的线性搜索更快的算法,尽可能多的答案使用Any()。根据数组创建的时间/方式以及数组在多少次重复使用而不重建的情况,可以先将它排序,然后使用不同的算法进行搜索。但是在我们能够推荐最佳算法之前,我们需要更多的上下文。 –

回答

8

尝试......

Search.Any(p => name.Contains(p)) 
+1

'有没有人知道做这种搜索的更快的方法?'是不是有问题的算法?真的更快? –

+0

据我所知,默认对象提供程序Any()方法执行线性搜索,直到它罚款一个。所以最坏的情况是O(N)。 –

+0

我正在执行它,但混乱。代码中的'p'是什么意思?谢谢 – user1034489

2
using System.Linq; 

string[] searchItems = ... 
string input = "This is the input text"; 

// Check whether at least one match found 
bool matchFound = input.Any(w => input.Contains(w)); 

// Count all matches 
int matchesCount = input.Where(w => input.Contains(w)) 
         .Count(); 
+0

我很困惑...''searchItems'永远不会用在你的代码中。 –

1
string[] searchItems = ...; 
string[] userNames = ...; 

var matches = userNames.Intersect(searchItems); 

你可以找到更多有关交叉法here

1

你可以这样做...

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

或尝试这样的....

string stringToCheck = "text1"; 
     string[] stringArray = { "text1", "testtest", "test1test2", "test2text1" }; 
     foreach (string x in stringArray) 
     { 
      if (x.Contains(stringToCheck)) 
      { 
       // Process... 
      } 

     } 

或像这样的东西

string stringToCheck = "text1text2text3"; 
string[] stringArray = new string[] { "text1" }; 
if (Array.Exists<string>(stringArray, (Predicate<string>)delegate(string s) { 
    return stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1; })) { 
    Console.WriteLine("Found!"); 
} 
+0

你会如何调整你的第一个版本以允许不变的比较? –

相关问题