2012-03-12 117 views
0

返回的字典鍵的存在,我有串人(鍵)和字符串地址的字典(值)。我想有一個if語句,如果我的字典中的任何鍵包含子字符串'anders',則返回true。有沒有辦法做到這一點?我試過dict.ContainsKey(「anders」),但如果任何鍵被明確命名爲「anders」,則返回true。即使密鑰是anderson或andersen,我也希望它返回true。我知道這是一個非常奇怪的情況,但我需要它的目的。通過搜索鍵子

謝謝

回答

1

沒有「wildc ard search「字典鍵。爲了做這種類型的搜索,你將失去字典給你的O(常量)搜索。

你必須遍歷字典的鍵,尋找那些包含您所需要的字符串。請注意,這將是O(n * X)迭代,其中n是密鑰的數量,X是您的密鑰字符串的平均大小。

有一個漂亮的一行代碼,這將有助於:

bool containsKey = myDictionary.Keys.Any(x => x.Contains("mySubString")); 

但它是一個沉重的操作。

6

你必須迭代收集並檢查每一個。該LINQ Any方法使這相當簡單:

dict.Keys.Any(k => k.Contains("anders")) 
0
var pair = dict.FirstOrDefault(kvp => kvp.Key.Contains("anders")); 
0
if(dict.Keys.Any(k=>k.Contains("anders"))) 
{ 
    //do stuff 
} 
0

可以遍歷字典的鍵和檢查每個如果它包含字符串:

bool found = false; 
foreach (string key in dict.Keys) 
{ 
    if (key.Contains("anders")) 
    { 
     found = true; 
     break; 
    } 
} 

或使用LINQ:

bool found = dict.Keys.Any(key => key.Contains("anders")); 
2

大家都已經指出了明顯的(和正確的)Any方法,但有一點需要注意:使用String.Contains作爲謂詞只會在子字符串的情況也是正確的情況下返回true。做一個區分大小寫的搜索,用一個簡單的正則表達式:

dict.Keys.Any(x => Regex.IsMatch(x, "(?i)anders")); 

或者使用的IndexOf與StringComparison參數(如Case insensitive 'Contains(string)'):

dict.Keys.Any(x => x.IndexOf("anders", StringComparison.InvariantCultureIgnoreCase) >= 0); 
+0

@ M.Babcock我已經更新了我的答案時,我看到了你的評論:) – 2012-03-12 18:41:13

+0

在我看來,字符串比較不如迭代更重要,但你提出了一個很好的觀點。 – Randolpho 2012-03-12 19:33:06