返回的字典键的存在,我有串人(键)和字符串地址的字典(值)。我想有一个if语句,如果我的字典中的任何键包含子字符串'anders',则返回true。有没有办法做到这一点?我试过dict.ContainsKey(“anders”),但如果任何键被明确命名为“anders”,则返回true。即使密钥是anderson或andersen,我也希望它返回true。我知道这是一个非常奇怪的情况,但我需要它的目的。通过搜索键子
谢谢
返回的字典键的存在,我有串人(键)和字符串地址的字典(值)。我想有一个if语句,如果我的字典中的任何键包含子字符串'anders',则返回true。有没有办法做到这一点?我试过dict.ContainsKey(“anders”),但如果任何键被明确命名为“anders”,则返回true。即使密钥是anderson或andersen,我也希望它返回true。我知道这是一个非常奇怪的情况,但我需要它的目的。通过搜索键子
谢谢
没有“wildc ard search“字典键。为了做这种类型的搜索,你将失去字典给你的O(常量)搜索。
你必须遍历字典的键,寻找那些包含您所需要的字符串。请注意,这将是O(n * X)迭代,其中n是密钥的数量,X是您的密钥字符串的平均大小。
有一个漂亮的一行代码,这将有助于:
bool containsKey = myDictionary.Keys.Any(x => x.Contains("mySubString"));
但它是一个沉重的操作。
你必须迭代收集并检查每一个。该LINQ Any
方法使这相当简单:
dict.Keys.Any(k => k.Contains("anders"))
var pair = dict.FirstOrDefault(kvp => kvp.Key.Contains("anders"));
if(dict.Keys.Any(k=>k.Contains("anders")))
{
//do stuff
}
可以遍历字典的键和检查每个如果它包含字符串:
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"));
大家都已经指出了明显的(和正确的)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);
@ M.Babcock我已经更新了我的答案时,我看到了你的评论:) – 2012-03-12 18:41:13
在我看来,字符串比较不如迭代更重要,但你提出了一个很好的观点。 – Randolpho 2012-03-12 19:33:06