c# - 如何在问题主体的上下文中对 2 个列表进行性能迭代?
问题描述
假设:
我们有 2 个不同大小的列表。
- 列表 A 包含 100 个项目。
- 列表 B 包含 1000000 个项目。
两个列表都是 type List<ObjectName>
。ObjectName
包含int Id
和string Name
。
列表 A 填充有 ID 和名称。列表 b 仅填充 Ids,String.Empty。
两个列表都可以填充重复的 ID。id 是两个列表中相同实体的主键。问题:如何有效地迭代(而不是 foreach)两个列表,以便使用列表 A 中的 Name 属性填充列表 B。
我的看法:列表不按 id 排序,但可以按 id 排序。我的问题不是它不起作用,它确实起作用了,但我相信我会遇到性能问题。我做了:
foreach (var userIdName in userIdNames)
{
foreach (var logItem in logList)
{
if (userIdName.Id == logItem.UserId)
{
logItem.UserName = userIdName.Name;
}
}
}
我想到了Paralel.Foreach,但我对此并不了解。有什么建议吗?
解决方案
因为ListB
需要设置每个项目的值,所以您别无选择,只能遍历该列表。
要优化操作,您需要转换ListA
为具有O(1)
访问权限的结构,以给出 的整体复杂度O(n)
,n
长度为ListB
。
很小ListA
,使用内存查找应该不是问题:
var lookup = userIdNames.ToLookup(x => x.Id, x => x.Name);
foreach (var logItem in logList)
{
logItem.UserName = lookup[logItem.UserId].FirstOrDefault();
}
这假定userIdNames
具有重复项的项目Id
始终具有相同的Name
.
推荐阅读
- java - JavaFX - 仅在 Internet Explorer 中打开 url
- javascript - 循环发送 XMLHttpRequest
- ios - 为什么Objective-C转换为swift错误
- php - 将旧的 .net 应用程序迁移到新的 php 应用程序:使用 sha1 算法实现密码加密/解密时遇到问题
- excel - Power Query:在同一行中有多个单元格的拆分表列
- swift - 在tableview单元格中按字母顺序对swift firebase中的多个数据进行排序
- mysql - 一个大小为 varchar(60) 的 MySQL 列可以容纳多少个字符?
- c++ - 如何运行gtest?
- r - 使用分区函数在 R 中编写快速排序函数时遇到错误
- c# - 条件一致时如何停止变换位置?