【问题标题】:Comparing two large lists and assigning property values from another比较两个大列表并分配另一个列表的属性值
【发布时间】:2018-01-26 22:06:25
【问题描述】:

我有一个非常简单的方法来比较两个列表,然后将值从第一个列表分配给第二个,如下所示:

private void FindUPC(List<ResultItem> filteredProducts, List<zsp_select_UserItems_Result> items)
    {
        foreach (var item in items)
        {
            foreach (var trItem in filteredProducts)
            {
                if (item.ItemID == trItem.ID)
                {
                    trItem.UPC = item.UPC;
                    trItem.EAN = item.EAN;
                    trItem.MPN = item.MPN;
                }
            }
        }
    }

但是,当在大型集合上执行此操作时,例如比较集合,其中每个列表包含 50000 个项目,此处所需的执行时间是惊人的 30000 毫秒(30 秒)......这会影响性能太可怕了,所以我想知道比较两个列表然后分配值的最快方法是什么,就像我在之前编写的示例中显示的那样?

谁能帮帮我?

附:伙计们,我可以为此使用 IEqualityComparer 吗?

@Stephen 你的意思是这样的吗:

private void FindUPC(List<ResultItem> filteredProducts, List<zsp_select_UserItems_Result> items)
{
    foreach (var item in items)
    {
        foreach (var trItem in filteredProducts)
        {
            if (item.ItemID == trItem.ID)
            {
                trItem.UPC = item.UPC;
                trItem.EAN = item.EAN;
                trItem.MPN = item.MPN;

            }
            break;
        }
    }
}

【问题讨论】:

  • 有人吗? =) =)
  • 那么您将需要使用具有恒定查找时间的东西。例如字典。
  • 如果两个列表都包含那么多记录,那么您可能需要重新考虑您的算法,或者实际上重新考虑为什么您认为需要这种比较...我不确定您的方法名称是否正确或者,它的功能真的不是findUPC,它类似于MutateFilteredProductsWithMachingUPC。这不应该是数据库应该做的事情吗?
  • 您的列表filteredProducts 是否实际上在更多用户之间共享,就我个人而言,我认为没有足够的信息来提供好的建议,除了您应该重新考虑为什么要在一个网站中拥有这么多产品列表,以及为什么要通过 for 循环对其进行变异
  • 那个用户需要每个列表一次有 50000 条记录?你怎样才能对这个逻辑做出有意义的表示?

标签: c# asp.net asp.net-mvc performance list


【解决方案1】:

将所有项目加载到具有持续查找的数据结构中。然后执行你的循环。

private void FindUPC(List<ResultItem> filteredProducts, List<zsp_select_UserItems_Result> items)
{
    var itemsDict = items.ToDictionary(i => i.ItemID);
    
    foreach (var trItem in filteredProducts)
    {
        if (itemsDict.TryGetValue(trItem.ID, out var item)) {
            trItem.UPC = item.UPC;
            trItem.EAN = item.EAN;
            trItem.MPN = item.MPN;
        {
    }
}

【讨论】:

  • 它在 "out var item" 上显示一个错误,说它在当前上下文中不存在?
  • 这是一个 C# 7 功能,你需要 Visual Studio 2017
  • @User987, 语法适用于 c# 6
  • @StephenMuecke 真的是C# 7
  • @npearson 仍然得到这个:没有与字典所需的形参“值”相对应的参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 2022-01-16
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多