You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:23:10