gpt4 book ai didi

c# - 使用另一个列表中的详细信息填充大量对象列表

转载 作者:行者123 更新时间:2023-11-30 20:15:23 25 4
gpt4 key购买 nike

我有一个大型数据库查询,它会将大约 100k 记录返回到内存列表中。我需要将相关员工列表链接到每条记录(也大约 100k 记录),但我正在努力获得可用的性能。

foreach (var detail in reportData.Details)
{
detail.Employees = employees
.Where(x => x.AccountingDocumentItemId == detail.AccountingDocumentItemId)
.Select(x => x.Employee)
.ToList();

detail.Employee = String.Join(", ", detail.Employees);
}

以上代码需要 8 分钟 才能完成。我已将速度问题缩小到 for 循环 的第一行,它会在其中找到相关员工。如果我省略了 ToList() 它会非常快,但是下一行会立即导致 String.Join 导致执行位置的问题。

我显然是从错误的角度来处理这个问题,但我已经用尽了所有我认为可行的选项。

最佳答案

您当前的代码具有 O(n ** 2) 时间复杂度(嵌套循环),因此您有 1e5 * 1e5 ~ 1e10 (100 亿)次操作,需要 8 分钟才能完成。

让我们提取一个字典,以便具有O(n) 时间复杂度(仅限~1e5 操作):

var dict = reportData
.Details
.GroupBy(item => item.AccountingDocumentItemId,
item => item.Employee)
.ToDictionary(chunk => chunk.Key,
chunk => chunk.ToList());

foreach (var detail in reportData.Details) {
detail.Employees = dict.TryGetValue(detail.AccountingDocumentItemId, out var list)
? list.ToList() // copy of the list
: new List<MyClass>(); // put the right type instead of MyType

detail.Employee = String.Join(", ", detail.Employees);
}

关于c# - 使用另一个列表中的详细信息填充大量对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55102008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com