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)
利用字典使项目查找更快,即
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)
| 归档时间: |
|
| 查看次数: |
287 次 |
| 最近记录: |