2011-11-07 104 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

你會如何調整你的第一個版本以允許不變的比較? –

相關問題