从值为列表的字符串中获取键<string> </string>

时间:2014-01-06 16:48:34

标签: c# list dictionary key

我有一个字典,其中键是字符串,值是字符串列表。

Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>() {
    {"alpha", new List<string> {"one", "two", "three"}}
    {"beta", new List<string> {"four", "five", "six"}}
    {"gamma", new List<string> {"seven", "eight", "nine"}}
}

当给出值中存在的字符串时,有没有办法返回密钥?

例如,给定"four",返回"beta"

我找到类似this的内容,但只有当值为单个而不是列表时才有效,而且我不知道如何使用列表执行此操作。

感谢。

2 个答案:

答案 0 :(得分:3)

按值搜索字典效率不高,但是:

string firstKey = dict.Where(kv => kv.Value.Contains("four"))
    .Select(kv => kv.Key)
    .FirstOrDefault(); // returns null if no list contains "four"

或者如果没有列表包含给定值,您可以提供默认密钥,那么使用First是安全的:

string firstKey = dict.Where(kv => kv.Value.Contains("foo"))
    .Select(kv => kv.Key)
    .DefaultIfEmpty("--no value found--")
    .First(); // result: "--no value found--"

答案 1 :(得分:3)

这里的问题是任何给定字符串值都可能有多个键。因此,您需要返回一个集合而不是单个键。这可以按如下方式完成

IEnumerable<string> FindAllKeys(Dictionary<string, List<string>> map, string value) {
  foreach (var pair in map) {
    if (pair.Value.IndexOf(value) >= 0) {
      yield return pair.Key;
    }
  }
}

如果你想在第一场比赛中关闭此搜索,你可以使用FirstOrDefault扩展方法

FindAllKeys(dict, "four").FirstOrDefault();