2012-03-12 80 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