如果密钥存在,则使用LINQ

时间:2016-04-01 17:28:23

标签: c# linq

我有一个字典,其中List为值。我想从列表中选择属于特定键的特定元素。到目前为止我试过这个:

Dictionary<int, List<bool>> dic = new Dictionary<int, List<bool>>();
dic.Add(1, new List<bool> { true, true, false });
var works = dic.Where(x => x.Key == 1).SingleOrDefault().Value.Where(x => x == true).ToList();
var doesNotWork = dic.Where(x => x.Key == 2).SingleOrDefault().Value.Where(x => x == true).ToList();

第一个LINQ有效,因为有一个等于1的键。因此我得到一个带有两个元素的List<bool>。 第二个LINQ不起作用,因为值为null。如何重写LINQ,如果字典中没有合适的密钥,我会得到一个空的List<bool>

我认为我的方法会起作用,因为我认为默认元素有一个空列表而不是null作为值。

7 个答案:

答案 0 :(得分:3)

您不应该使用LINQ在Dictionary中找到密钥 - Dictionary有更有效的方法来执行此操作 - ContainsKey /索引器对或更优化{ {1}}。

例如:

TryGetValue

(A)

int key = 2;

(B)

var result = dic.ContainsKey(key) ? dic[key].Where(x => x == true).ToList() : new List<bool>();

答案 1 :(得分:2)

免责声明:此仅适用于C#6.0及更高版本(VS 2015 +)

如果您真的想使用linq在一行中执行此操作,可以使用?.运算符(空条件运算符)并获取如下所示的行:

var shouldWork = dic.Where(x => x.Key == 2)?.SingleOrDefault().Value.Where(x => x == true).ToList() ?? new List<bool>();

这会将shouldWork设置为linq查询的结果或空列表。您可以将new List<bool>()替换为您想要的任何内容

有关C#6.0中新功能的信息,请参阅MSDN post hereGithub post here,具体来自github网站的此示例:

  

int length = customers?.Length ?? 0; // 0如果客户为空

及其工作原理说明

  

零条件运算符表现出短路行为,   紧接着的成员链访问的元素   访问和调用只会在原始时执行   接收者不是空的

编辑:从?检查null,您可以将上面的linq查询简化为:

var shouldWork = dic[key]?.Where(x => x == true).ToList() ?? new List<bool>();

其中key是一个持有你的密钥的变量

答案 2 :(得分:1)

为什么需要LINQ?

List<bool> works1 = dic.ContainsKey(1) ? dic[1] : new List<bool>();

答案 3 :(得分:0)

最简单的解决方案是使用Dictionary<T>.TryGetValue,这样您就不会检查两次值,即:

        Dictionary<int, List<bool>> dic = new Dictionary<int, List<bool>>();
        dic.Add(1, new List<bool> { true, true, false });

        List<bool> match = null;
        var found = dic.TryGetValue(2, out match);
        if (!found) match = new List<bool>();

答案 4 :(得分:0)

试试这个

while len(objects):
    object = objects.pop(0)
    print "delete ", object

答案 5 :(得分:0)

你想获得一个奇怪的结果,但无论如何这段代码可以帮助你:

 var reslt = (dic.FirstOrDefault(x => x.Key == 2).Value ?? new List<bool>(0))
.Where(x => x)
.ToList();

使用方法SingleOrDefault()不正确,因为Dictionary中的键是唯一的。

x =&gt; x == true也很奇怪。

答案 6 :(得分:0)

我们不知道为什么它需要成为LINQ,但这可能是一个选择:

var nowItWork = dic.Where(x => x.Key == 2).SelectMany(x => x.Value).Where(x => x).ToList();