Skip to main content
 首页 » 编程设计

c#之如何在没有第二个LINQ查询的情况下获取排除的集合

2024年01月18日28虾米姐

我有一个看起来像这样的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(),并且工作仅完成一次。