我有一个字典,其中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作为值。
答案 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 here和Github 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();