搜索键匹配C#中列表字典中的值

时间:2017-01-17 07:11:02

标签: c# dictionary

我有一份清单字典。

var dicAclWithCommonDsEffectivity = new Dictionary<string, List<int>>();
var list1 = new List<int>(){1,2,3};
var list2 = new List<int>(){2,4,6};
var list3 = new List<int>(){3,7,6};
var list4 = new List<int>(){8,7,6};

dicAclWithCommonDsEffectivity.Add("ab",list1);
dicAclWithCommonDsEffectivity.Add("bc",list2);
dicAclWithCommonDsEffectivity.Add("cd",list3);
dicAclWithCommonDsEffectivity.Add("de",list4);

我想获取字典中的键,其中至少有一个匹配值与当前键列表。 对于关键&#34; ab&#34;(第一个列表)。我应该得到:"ab","bc" and "cd"。因为这些列表包含{1,2,3}

中的一个匹配元素

是否有办法不循环遍历字典值列表中的每个项目。

3 个答案:

答案 0 :(得分:5)

  

是否有办法不循环遍历字典值列表中的每个项目。

某些东西必须循环 - 字典只能通过查找,除了第一次检查之外你不会这样做。

你可以很容易地做到这一点:

Dictionary

这使用IEnumerable<KeyValuePair<TKey, TValue>>实现Where的事实 - 因此Select子句通过发现其值的任何元素是否与原始元素的任何元素匹配来检查特定条目值。然后int子句将该对投影到密钥。

如果您需要做很多事情并且关注效率,另一种选择是建立从List<string>Distinct的第二个字典 - 基本上是反向映射。您需要保持这一点,但随后您可以轻松地获取映射到与给定密钥对应的每个值的所有“原始密钥”,并使用<select class="form-control" name="exam_type" id="exam_type" style="width: 100%;" <?php if ($student_details) { echo "disabled"; } ?> > <option value = "1" <?php if ($exam == 1) echo 'selected'; ?> >H</option> <option value = "2" <?php if ($exam == 2) echo 'selected'; ?> >A</option> <option value = "3" <?php if ($exam == 3) echo 'selected'; ?> >M</option> <option value = "4" <?php if ($exam == 4) echo 'selected'; ?> >N</option> </select> <input type="hidden" name="action" value="save" class="form-control"> <?php if ($action_type == 'save') { echo '<input type="submit" name="save" value="Save Marks" class="btn btn-block btn-primary">'; } else { echo '<input type="submit" name="save" value="Load Students" class="btn btn-block btn-primary" onclick="return validateForm(); ">'; } ?> 来避免重复。

答案 1 :(得分:1)

如果你的意思是明显地(不是逻辑)删除循环,你可以使用LINQ和适当的Where过滤器来做Select来自keys的{​​{1}} DictionaryListList Dictionary相交的key == "ab" string key = "ab"; List<int> selectedList = dicAclWithCommonDsEffectivity[key]; var results = dicAclWithCommonDsEffectivity .Where(x => x.Value.Any(y => selectedList.Contains(y))) .Select(x => x.Key); 1}} Sheet1}像这样:

Sheet2

如果您想逻辑删除循环,请考虑Skeet先生的回答。

答案 2 :(得分:1)

在访问之前检查词典中是否存在searchKey总是更好。然后,您可以在字典中获取该特定键的关联列表。

你也可以尝试这样:

string searchKey = "ab";
if (dicAclWithCommonDsEffectivity.ContainsKey(searchKey))
{
    var ListToSearch = dicAclWithCommonDsEffectivity[searchKey];
    var resultKeys = dicAclWithCommonDsEffectivity.Where(x => 
                                                 x.Value.Any(y => ListToSearch.Contains(y)))
                                                  .Select(x => x.Key)
                                                  .ToList();
}
else
{
    // Specified key was not found
}