首页 > 解决方案 > 如何在问题主体的上下文中对 2 个列表进行性能迭代?

问题描述

假设:

我们有 2 个不同大小的列表。

两个列表都是 type List<ObjectName>ObjectName包含int Idstring 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,但我对此并不了解。有什么建议吗?

标签: c#listsorting

解决方案


因为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.


推荐阅读