我有如下代码,如何避免使用下面的 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)
{
// add contactids for the agreemenet
var _agreementContacts = await this.contactRepository.GetAgreementContactsAsync(_agreement.AgreementId.Value, null);
foreach (var _contact in _agreementContacts.Data)
{
if (_contact.Role.RoleId == DCCommonConstants.RoleId.KeyPersonnel &&
_contact.PersonActive &&
!_contacts.ContainsKey(_contact.ContactId.Value))
{
_contacts.Add(_contact.ContactId.Value, _contact);
}
}
}
任何帮助将不胜感激,提前致谢。
你不写为什么你想这样做,但像下面这样的东西应该可以解决问题:
var contacts = _agreementContacts.Data
.Where(c => c.Role.RoleId == DCCommonConstants.RoleId.KeyPersonnel &&
c.PersonActive)
.GroupBy(c => c.ContactId.Value)
.ToDictionary(c => c.First().ContactId.Value, _contact => _contact);
当我阅读GroupBy文档时,组中的元素保留原始顺序,因此获取这些元素的
First()
应该相当于检查该键是否已在字典中。