检查字典中是否有给定的字符串

时间:2019-03-31 15:11:52

标签: c# dictionary

我要检查,如果字典中的中有特定字符串,并且我已经尝试过这种方法,但是不是。工作。

var dict = new Dictionary<string, List<string>>();


dict["John"] = new List<string>() { "pop", "folk" };
dict["Mark"] = new List<string>() { "pop-folk", "jazz" };

if (dict.ContainsValue(new List<string>() { "pop" }))
{
    Console.WriteLine("yes");
}
else
{
    Console.WriteLine("no");
}

我想检查是否有字符串“ pop” ,我希望“是” ,但是代码不起作用。另一个示例是检查是否存在“跳舞” ,并且预期输出将为“否” 。我希望你明白我的意思。如果您能向我解释最好的方法,我将不胜感激。

2 个答案:

答案 0 :(得分:7)

dict.ContainsValue无法正常工作有两个原因:

  • List<T>不会覆盖Equals,因此您正在针对新对象检查引用是否相等
  • ContainsValue寻找一个等于的值-您想寻找一个包含特定键的值。这将是一个奇怪的相等比较器,声称具有两个不同值的列表等于这些值之一。

幸运的是,解决方案很简单。您可以使用dictionary.Values获取一系列值,然后使用Any检查其中的任何值是否包含您要查找的值:

private static bool ContainsValue(Dictionary<string, List<string>> dictionary, string value)
    => dictionary.Values.Any(list => list.Contains(value));

如其他地方所述,如果您经常使用这样的字典,则可能表明您应该使用其他数据结构。它肯定会工作,但不会利用字典专用的廉价“按键查找”功能。

答案 1 :(得分:2)

 private static bool ContainsValue(Dictionary<string, List<string>> dictionary, string value)
 {
    return dictionary.Keys.Any(k => dictionary[k].Contains(value));            
 }

但是您永远不要以这种方式使用字典。仅当您要按键查找时,才应使用它。但是在这种情况下,您正在搜索一个值。