如何无需迭代从IEnumerable中筛选匹配ID的元素集合
简化筛选匹配ID的Personel对象的写法
你可以用**LINQ(Language Integrated Query)**来大幅简化代码,同时还能优化性能:
优化后的代码
如果你的personelIEn是泛型的IEnumerable<Personel>:
List<int> pIds = ....// 存储指定的人员ID IEnumerable<Personel> personelIEn = ....// 存储Personel数据 // 转成HashSet提升ID查找性能 HashSet<int> pIdSet = new HashSet<int>(pIds); // 筛选并生成结果列表 List<Personel> personelByTag = personelIEn .Where(personel => pIdSet.Contains(personel.DocumentID)) .ToList(); return personelByTag;
如果personelIEn是非泛型的IEnumerable,需要先做类型转换:
List<int> pIds = .... IEnumerable personelIEn = .... HashSet<int> pIdSet = new HashSet<int>(pIds); List<Personel> personelByTag = personelIEn .Cast<Personel>() .Where(personel => pIdSet.Contains(personel.DocumentID)) .ToList(); return personelByTag;
为什么这更好?
- 写法简洁:用
Where方法替代手动foreach循环,逻辑一目了然,代码量减少一半以上 - 性能更优:将
List<int>转为HashSet<int>是核心优化——List.Contains()是线性查找(时间复杂度O(n)),而HashSet.Contains()是哈希查找(时间复杂度O(1)),当ID列表元素较多时,性能提升会非常显著 - 减少内存开销:不需要先把
personelIEn转成List再循环,直接在原IEnumerable上操作,避免不必要的内存分配
内容的提问来源于stack exchange,提问作者vegetta
相关产品推荐
相关产品推荐

