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; } ```

Original source