使用SubList <T>性能更新List <T>(LINQ或Not)

Dun*_*oud 3 c# linq generics list updates

我有一个列表,可以有~200'000项.我需要使用子列表更新固定数量的字段,例如150项.这是我现在使用的代码:

listItem:200'000 item List - subListItem:150 item List(已更新)

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();
Run Code Online (Sandbox Code Playgroud)

这样做很好,但性能确实很差.你有什么建议吗?

更新的解决方案:

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;
}
Run Code Online (Sandbox Code Playgroud)

Luk*_*oid 5

利用字典使项目查找更快,即

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您的原件listItem将包含已修改的对象.这仅在包含的项目listItem是引用类型时才有效.如果它们是可变结构,则需要执行与您的示例类似的操作:

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();
Run Code Online (Sandbox Code Playgroud)

  • 如果原始容器被优化为使用字典会更好.这优化了150x查找,优化200.000x查找会更快. (2认同)