代码之家  ›  专栏  ›  技术社区  ›  David B

映射列表未从主列表获取所有项

  •  1
  • David B  · 技术社区  · 7 年前

    我出口了3.2万件产品,但有一个奇怪的问题,重新列出的只有1917件,我不知道为什么是这样。

     private List<FTradeItemsExport> MapTradeItems(List<TradeItems> tradeItem)
        {
            List<TradeItemsExport> retList = new List<TradeItemsExport>();
            try
                {
    
                    var StockImport = new Fuel_StockItemImports();
    
    
                    List<StandardLookUpList> _AnalsisCodes = GetAnayalsisCodesForExportCode();
    
                    StandardLookUpList sport = new StandardLookUpList();
                    StandardLookUpList gender = new StandardLookUpList();
                    StandardLookUpList colour = new StandardLookUpList();
                    StandardLookUpList Size = new StandardLookUpList();
                    StandardLookUpList categorycode = new StandardLookUpList();
                    StandardLookUpList categorydesc = new StandardLookUpList();
                    StandardLookUpList subcategorycode = new StandardLookUpList();
                    StandardLookUpList subcategorydesc = new StandardLookUpList();
    
                    StandardLookUpList brandcode = new StandardLookUpList();
                    StandardLookUpList branddesc = new StandardLookUpList();
    
    
                    foreach (var item in tradeItem)
                    {
    
                        var codesForThisItem = _AnalsisCodes.Where(w => w.ItemCode == item.ItemCode);
                        if (codesForThisItem.Any())
                        {
                            sport = codesForThisItem.FirstOrDefault(x => x.code == Constants.Sport);
    
                            gender = codesForThisItem.FirstOrDefault(x => x.code == Constants.Gender);
                            colour = codesForThisItem.FirstOrDefault(x => x.code == Constants.Colour);
                            Size = codesForThisItem.FirstOrDefault(x => x.code == Constants.Size);
                            categorycode = codesForThisItem.FirstOrDefault(x => x.code == Constants.Colour);
                            categorydesc = codesForThisItem.FirstOrDefault(x => x.code == Constants.Category);
    
                            subcategorycode = codesForThisItem.FirstOrDefault(x => x.code == Constants.Category);
                            subcategorydesc = codesForThisItem.FirstOrDefault(x => x.code == Constants.SubCategory);
                            brandcode = codesForThisItem.FirstOrDefault(x => x.code == Constants.Brand);
                        }
                        retList.Add(new  TradeItemsExport()
                        {
                            ItemCode = item.ItemCode,
                            BarCode = item.BarCode,
                            Description = item.Description,
                            SupplierCode = item.SupplierCode,
                            SupplierStockCode = item.SupplierStockCode,
                            Product_Group_Code = "",
                            Product_Group_Desc = "",
                            SportCode = sport.LookupValue.ToStringOrEmpty(),
                            SportDesc = sport.description.ToStringOrEmpty(),
                            GenderCode = gender.LookupValue.ToStringOrEmpty(),
                            GenderDesc = gender.description.ToStringOrEmpty(),
                            ColourCode = colour.LookupValue.ToStringOrEmpty(),
                            ColourDesc = colour.description.ToStringOrEmpty(),
                            SizeCode = Size.LookupValue.ToStringOrEmpty(),
                            SizeDesc = Size.description.ToStringOrEmpty(),
                            CategoryCode = categorycode.LookupValue.ToStringOrEmpty(),
                            CategoryDesc = categorydesc.description.ToStringOrEmpty(),
                            subcategorycode = subcategorycode.LookupValue.ToStringOrEmpty(),
                            subcategorydesc = subcategorydesc.description.ToStringOrEmpty(),
                            BrandsCode = brandcode.LookupValue.ToStringOrEmpty(),
                            BrandsDesc = branddesc.description.ToStringOrEmpty(),
                            Vat = item.Vat,
                            GrossWeight = item.Weight,
                            CommodityCode = item.CommodityCode,
                            price_exVAT = item.price_exVAT,
                            price_incVAT = item.price_incVAT,
                            currentprice_exVAT = item.currentprice_exVAT,
                            currentprice_incVAT = item.currentprice_incVAT,
                            creation_date = item.creation_date,
                            Inactive_date = item.Inactive_date,
                            status = 1
    
    
    
                        });
                        var Stock = new Fuel_StockItemImport();
    
    
    
                        Stock.StockItem = item.ItemCode;
                        Stock.IsProcessed = true;
                        Stock.DateImported = DateTime.Now;
                        StockImport.Add(Stock);
                        StockImport.Update();
    
    
                    }
    
    
                }
                catch (Exception ex)
                {
    
                }
                return retList;
    
    
        }
    

    如您所见,下面是映射列表中预期的项目的真实数字,我不明白,因为我没有得到任何数据异常?。当我检查代码并检查刹车点时,它不会在任何引用为空的地方爆炸,所以不确定发生了什么。

    enter image description here enter image description here

    1 回复  |  直到 7 年前
        1
  •  3
  •   Sergey Kalinichenko    7 年前

    这可能发生的唯一方法是,在插入1912个项目之后,忽略循环中间的异常。

    最可能的原因是 ToStringOrEmpty() 施工时 TradeItemsExport 物体。你可以用 ?. 操作员。

    一般来说,不应忽略所有异常。 catch (Exception ex) { } 那没用。如果不知道如何处理异常,就不应该有捕获它的代码。在这种情况下,它显然是一个编程问题(无法对对象进行null检查)。 try / catch 应该全部移除。

    (摘自评论) 有没有一种更快的合并方法?

    你可以通过更换 Where(w => w.ItemCode == item.ItemCode) 在字典中使用基于哈希的查找:

    var byItemCode = _AnalsisCodes
        .GroupBy(w => w.ItemCode)
        .ToDictionary(g => g.Key, g => g.First());
    ...
    foreach (var item in tradeItem) {
        if (byItemCode.TryGetValue(item.ItemCode, out var codesForThisItem) && codesForThisItem.Any()) {
            ...
        }
    }
    

    如果这并不能加快足够的速度,那么你需要重新组织内部的查找。 codesForThisItem 在进入循环之前设置字典。