通过搜索关键子字符串返回字典中键的存在

时间:2012-03-12 18:19:53

标签: c#

我有字符串人(键)和字符串地址(值)的字典。我希望有一个if语句,如果我的字典中的任何键包含子字符串'anders',则返回true。有没有办法做到这一点?我已经尝试过dict.ContainsKey(“anders”),但如果任何键被明确命名为“anders”,则返回true。即使钥匙是安德森或安徒生,我也希望它能回归真实。我知道这是一个非常奇怪的案例,但我需要它才能达到目的。

由于

6 个答案:

答案 0 :(得分:6)

您必须遍历集合并检查每个集合。 LINQ Any方法使这很简单:

dict.Keys.Any(k => k.Contains("anders"))

答案 1 :(得分:2)

每个人都已经指出了明显的(和正确的)Any方法,但有一点需要注意:如果子字符串的大小写也是正确的,那么使用String.Contains作为谓词只会返回true。要进行不区分大小写的搜索,请使用简单的Regex:

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);

答案 2 :(得分:1)

字典键没有“通配符搜索”。为了进行这种类型的搜索,您将失去字典为您提供的O(常量)搜索。

您必须迭代字典的键并查找包含所需子字符串的字符串。请注意,这将是一个O(n * X)迭代,其中n是键的数量,X是键字符串的平均大小。

有一个漂亮的单行有助于:

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

但这是一次沉重的行动。

答案 3 :(得分:0)

var pair = dict.FirstOrDefault(kvp => kvp.Key.Contains("anders"));

答案 4 :(得分:0)

if(dict.Keys.Any(k=>k.Contains("anders")))
{
    //do stuff
}

答案 5 :(得分: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"));