У меня есть два списка ниже:
var listA = new List<CompanyContact>(listAItems);
var listB = new List<CompanyContactDto>(listBItems);
public class CompanyContact
{
public string Id { get; set; }
public string ContactId { get; set; }
public bool IsMainContact { get; set; }
public string Email { get; set; }
}
public class CompanyContactDto
{
public string CompanyId { get; set; }
public string ContactId { get; set; }
public DateTime LastSavedDateTime { get; set; }
public string Email { get; set; }
}
Теперь я хочу скопировать свойство электронной почты из списка B в список A, где contactId одинаков в обоих списках.
var contacts = mapper.Map(listA, listA);
но он обнуляет другие элементы
Я пробовал автомаппер. я обновил свой вопрос
foreach (var companyContactDto in listB)
{
var matchingContacts = listA.Where(c => c.ContactId == companyContactDto.ContactId);
foreach (var companyContact in matchingContacts)
{
companyContact.Email = companyContactDto.Email;
}
}
Со словарем для перечисления listA
только один раз:
var contactsByContactId = listA.ToDictionary(c => c.ContactId);
foreach (var companyContactDto in listB)
{
if (contactsByContactId.TryGetValue(companyContactDto.ContactId, out var matchingContact)
{
matchingContact.Email = companyContactDto.Email;
}
}
ToDictionary
потерпит неудачу, если будет более одного совпадения.
как насчет,
var aLookup = listA.ToLookup(a => a.ContactId);
foreach (var b in listB)
{
foreach(var a in aLookup[b.ContactId])
{
a.Email = b.Email;
}
}
или, с меньшим количеством кода,
foreach ((var a, var b) in aList.Join(
bList,
a => a.ContactId,
b => b.ContactId,
(a, b) => (a, b)))
{
a.Email = b.Email;
}
что ты уже испробовал?