我有一个看起来像这样的LINQ查询:
var p = option.GetType().GetProperties().Where(t => t.PropertyType == typeof(bool));
在不对列表执行第二次迭代的情况下,获取未包含在该查询中的项目的最有效方法是什么。
我可以轻松地通过
for循环执行此操作,但我想知道LINQ是否有简写形式。
请您参考如下方法:
var p = option.GetType().GetProperties().ToLookup(t => t.PropertyType == typeof(bool));
var bools = p[true];
var notBools = p[false];
.ToLookup()用于根据键函数对IEnumerable进行分区。在这种情况下,它将返回一个Lookup,其中最多包含2个项目。可以使用类似于IDictionary的键来访问Lookup中的项目。
.ToLookup()被立即求值并且是O(n)操作,在结果Lookup中访问分区是O(1)操作。
查找与字典非常相似,并且具有相似的通用参数(键类型和值类型)。但是,在Dictionary将键映射到单个值的地方,Lookup将键映射到一组值。查找可以实现为
IDictionary<TKey, IEnumerable<TValue>>
.GroupBy()也可以使用。但是它与
.ToLookup()的不同之处在于,GroupBy是惰性计算的,可能会被多次枚举。立即评估
.ToLookup(),并且工作仅完成一次。
