【发布时间】:2014-11-17 16:06:22
【问题描述】:
假设我有这样的课程:
class ItemLimits
{
public string strAccountNumber = string.Empty;
public string strUserCode = string.Empty;
public long lAccumulatedAmount = 0L;
}
我有一个包含 50000 个元素的数组。
我还有一个包含 50000 项(或多或少)的数据集,我需要在 ItemLimits 数组中找到与该数据集匹配的元素。
目前这是通过数据集循环完成的:
ItemLimits ilItemLimit = itemlimits.Where(s => s.strUserCode.Equals(dataset[i].User_UserCode, StringComparison.CurrentCultureIgnoreCase)
&& s.strAccountNumber.Equals(strUnEditedHomingAccountNo, StringComparison.CurrentCultureIgnoreCase)).First();
strUnEditedHomingAccountNo 是之前从数据集中获取的。
找到我需要的ItemLimit 后,我需要添加到它的lAccumulatedAmount。
我从性能基准中看到的是,循环开始时速度非常快,但随着时间的推移会变慢。这是一个线性减速,您可以在我制作的这张图中看到:
当我达到约 40000 个项目时,每个项目需要约 40 毫秒才能完成。这在我的脑海中是有道理的,因为我假设它只是逐个迭代项目直到找到匹配项,这对于大量项目显然非常慢。
数组和数据集中的项目数可能相差很大。
我曾考虑尝试订购数组并执行Array.BinarySearch,但我不知道如何最有效地订购它,因为strUserCode 和strAccountNumber 都可以更改,我可以' t 预测数据集的顺序。
这是程序中最慢的部分,这也是我想尝试优化它的原因(大约 70% 的时间都花在了这样做上,还有很多其他事情要做)。
如果有人能给我一些关于我能做什么的建议,将不胜感激。
我使用的是 .NET 3.5,但无法更改。
【问题讨论】:
-
这个问题似乎是题外话,因为它属于codereview.stackexchange.com
-
糟糕。是否可以迁移问题,或者我应该删除它并去那里问?
-
我不知道,也许版主可以做到。
-
不如先将 ItemLimits 存储在 List 中,然后在将其链接到匹配的数据记录后将其删除?
-
@Zache ItemLimits 可以多次使用。他们必须留在那里。
标签: c# arrays linq collections .net-3.5