当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《搜索键匹配C#中列表中的值》经验,为你挑选了1个好方法。

我有一份清单.

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

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

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

有没有办法没有循环遍历字典值列表中的每个项目.



1> Jon Skeet..:

有没有办法没有循环遍历字典值列表中的每个项目.

有些东西必须循环 - 字典只能按键查找,除了第一次检查之外,你不会这样做.

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

private IEnumerable GetMatchingKeys(
    Dictionary> dictionary, string key)
{
    // TODO: Use TryGetValue if key might not be in dictionary
    HashSet elements = new HashSet(dictionary[key]);
    return dictionary.Where(pair => pair.Value.Any(x => elements.Contains(x)))
                     .Select(pair => pair.Key);
}

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

如果你需要做这个有很多和你关心效率,另一种方法是建立从第二字典intList-基本上是一个反向映射.您需要保持这一点,但随后您可以轻松地获取映射到与给定键对应的每个值的所有"原始键",并且只是Distinct用来避免重复.


@ un-lucky:不,它不会给出`NullReferenceException` - 它会给出一个`KeyNotFoundException`.你不应该使用`ContainsKey`,因为那时你将进行两次查找 - 你应该使用`TryGetValue`,就像我在评论中写的一样.但是,如果期望键*将*在字典中(并且其他任何地方代表其他地方的错误),我不会这样做 - 在这种情况下,异常是合适的.
推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有