Update a List<T> witha SubList<T> performance (LINQ or Not)
c#, generics, linq, list, updates
Solution
Make use of a dictionary to make the item lookup much quicker, i.e.
var subListItemsById = subListItems.ToDictionary(x => x.ID);
foreach(var item in listItem)
{
SubListItem subListItem;
if(subListItemsById.TryGetValue(item.ID, out subListItem))
{
item.FIELD_1 = subListItem.FIELD_1;
item.FIELD_2 = subListItem.FIELD_2;
item.FIELD_3 = subListItem.FIELD_3;
item.FIELD_4 = subListItem.FIELD_4;
}
}
Your original `listItem` will contain the modified objects. This will only work if the items contained in `listItem` are reference types. If they are mutable structs you will need to do similar to your example:
var subListItemsById = subListItems.ToDictionary(x => x.ID);
var modifiedItems = listItem.Select(item =>
{
SubListItem subListItem;
if(subListItemsById.TryGetValue(item.ID, out subListItem))
{
item.FIELD_1 = subListItem.FIELD_1;
item.FIELD_2 = subListItem.FIELD_2;
item.FIELD_3 = subListItem.FIELD_3;
item.FIELD_4 = subListItem.FIELD_4;
}
return item;
}).ToList();
Problem
I have a list which can have ~200'000 items. I need to update a fixed number of fields for, for instance 150 item, using a sub-list. This is the code I am using right now: listItem: 200'000 item List - subListItem: 150 item List (updated) ``` listItem.Select(item => { if (subListItem.Exists(x => x.ID == item.ID)) { var currentItem = subListItem.Single(x => x.ID == item.ID); item.FIELD_1 = currentItem.FIELD_1; item.FIELD_2 = currentItem.FIELD_2; item.FIELD_3 = currentItem.FIELD_3; item.FIELD_4 = currentItem.FIELD_4; } return item; }).ToList(); ``` This is working good, but performance are really poor. Have you any advice ? UPDATED SOLUTION: ``` dictItem = listItem.ToDictionary(x => x.ID); foreach (Item updatedItem in subListItem) { Item originalItem = dictItem[updatedItem.ID]; originalItem.FIELD_1 = updatedItem.FIELD_1; originalItem.FIELD_2 = updatedItem.FIELD_2; originalItem.FIELD_3 = updatedItem.FIELD_3; originalItem.FIELD_4 = updatedItem.FIELD_4; dictItem[updatedItem.ID] = originalItem; } ```