如何避免使用foreach循环,遍历列表向Dictionary添加键值对?
替代foreach循环向Dictionary添加键值对的方案
你可以通过LINQ结合List的ForEach方法来替代显式的foreach循环,同时保留原有的过滤和添加逻辑,修改后的代码如下:
DataQueryResult<Agreement> _agreements = new DataQueryResult<Agreement>(); Dictionary<Guid, Contact> _contacts = new Dictionary<Guid, Contact>(); _agreements = this.agreementRepository.GetAgreementsByQuery(_parameters); Agreement _agreement = _agreements?.Data?.FirstOrDefault(); if (_agreement?.AgreementActive == true) { var _agreementContacts = await this.contactRepository.GetAgreementContactsAsync(_agreement.AgreementId.Value, null); // 筛选符合条件的联系人,再批量添加到字典 var eligibleContacts = (_agreementContacts.Data ?? Enumerable.Empty<Contact>()) .Where(c => c.Role?.RoleId == DCCommonConstants.RoleId.KeyPersonnel && c.PersonActive && c.ContactId.HasValue && !_contacts.ContainsKey(c.ContactId.Value)); eligibleContacts.ToList().ForEach(c => _contacts.Add(c.ContactId.Value, c)); }
细节说明
- 过滤逻辑前置:用LINQ的
Where方法一次性筛选出所有满足要求的联系人,包括角色匹配、状态激活、ContactId有效且未存在于目标字典中 - 避免显式foreach:将筛选结果转为List后,调用List内置的
ForEach方法完成添加操作,消除了手动编写foreach循环的代码 - 健壮性优化:增加了
_agreement?.AgreementActive的空引用检查,以及c.Role?.RoleId的空值保护,避免潜在的NullReferenceException
如果需要完全避免遍历类操作(包括ForEach),也可以先通过LINQ构建符合条件的新字典,再合并到原有字典,但这种方式仍需用foreach完成合并(若原有字典非空),示例如下:
if (_agreement?.AgreementActive == true) { var _agreementContacts = await this.contactRepository.GetAgreementContactsAsync(_agreement.AgreementId.Value, null); // 构建符合条件的新字典 var newContacts = (_agreementContacts.Data ?? Enumerable.Empty<Contact>()) .Where(c => c.Role?.RoleId == DCCommonConstants.RoleId.KeyPersonnel && c.PersonActive && c.ContactId.HasValue) .ToDictionary(c => c.ContactId.Value, c => c); // 合并到原有字典(跳过已存在的键) foreach (var kvp in newContacts) { _contacts.TryAdd(kvp.Key, kvp.Value); } }
这里使用TryAdd方法替代ContainsKey+Add,代码更简洁,但仍保留了foreach循环,适合对过滤逻辑和字典构建分离有需求的场景。
内容的提问来源于stack exchange,提问作者Abdul
相关产品推荐
相关产品推荐

