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

C# 检查字典中是否有给定字符串,c#,dictionary,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(n

我想检查字典值的中是否有特定的字符串,我已经尝试过这种方法,但它不起作用

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");
}
var dict=newdictionary();
dict[“John”]=newlist(){“pop”,“folk”};
dict[“Mark”]=newlist(){“流行音乐”、“爵士乐”};
if(dict.ContainsValue(新列表(){“pop”}))
{
控制台。WriteLine(“是”);
}
其他的
{
控制台。写入线(“否”);
}
我想检查是否存在字符串“pop”,我希望“yes”,但代码不起作用。另一个示例是检查是否存在“dance”,预期输出将是“no”。我希望你明白我的意思。如果你能向我解释一下最好的方法,我将不胜感激

私有静态bool包含值(字典、字符串值)
 private static bool ContainsValue(Dictionary<string, List<string>> dictionary, string value)
 {
    return dictionary.Keys.Any(k => dictionary[k].Contains(value));            
 }
{ 返回dictionary.Keys.Any(k=>dictionary[k].Contains(value)); }

但是你不应该这样使用字典。只有在需要按键查找时才应使用它。但在本例中,您正在搜索一个值。

dict.ContainsValue
因以下两个原因不起作用:

  • List
    不会覆盖
    Equals
    ,因此您正在针对新对象检查引用相等性
  • ContainsValue
    查找一个相等的值-您要查找一个包含特定键的值。这将是一个奇怪的相等比较器,它声称具有两个不同值的列表等于其中一个值
幸运的是,解决方案很简单。您可以使用
dictionary.Values
获取一系列值,然后使用
Any
检查任何值是否包含您要查找的值:

private static bool ContainsValue(Dictionary<string, List<string>> dictionary, string value)
    => dictionary.Values.Any(list => list.Contains(value));
私有静态bool包含值(字典、字符串值)
=>dictionary.Values.Any(list=>list.Contains(value));

正如其他地方提到的,如果您经常像这样使用字典,这可能表明您应该使用不同的数据结构。它肯定会起作用,但不会利用字典设计的廉价“按键查找”功能。

第一个想法-在foreach循环中检查
值是否
,因为
列表
包含您的元素(
pop
dance
)。您的
dict.ContainsValue(new List(){“pop”})
不起作用,因为
dict
中没有
new List(){“pop”}
这样的值。在
dict
中,您的值部分包含您的值这是另一回事。非常感谢。是的,我知道当我想按键查找时,我应该只使用字典,但我正在测试一些问题。这会找到键,然后对每个键进行查找-使用
属性更简单,因为我们只关心值。