比较两个大型列表并从另一个列表中分配属性值

时间:2018-01-26 22:06:26

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

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

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秒)...这会极大地影响性能,所以我想知道比较两个列表的最快方法是什么,然后分配我之前的例子中所显示的我所写的值?

有人能帮助我吗?

P.S。我可以为此使用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;
        }
    }
}

1 个答案:

答案 0 :(得分:4)

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

private void FindUPC(List<ResultItem> filteredProducts, List<zsp_select_UserItems_Result> items)
{
    var itemsDict = items.ToDictionary(i => i.ItemID, i => i);

    foreach (var trItem in filteredProducts)
    {
        zsp_select_UserItems_Result item;
        if (itemsDict.TryGetValue(trItem.ID, out item)) {
            trItem.UPC = item.UPC;
            trItem.EAN = item.EAN;
            trItem.MPN = item.MPN;
        {
    }
}