修改List <t>的副本并与原始List <t>

时间:2016-03-10 15:21:22

标签: c# list datagridview

我有一个从sql存储过程填充的List(T)。

    dailyReqsList = ShipDB.GetDailyReqs(loadValues);

此列表填充数据网格视图。

dgvDailyReqs.DataSource = dailyReqsList;
dgvDailyReqs.Refresh();
CurrencyManager cm = 
CurrencyManager)(dgvDailyReqs.BindingContext[dailyReqsList]);
cm.Refresh();

如果单击特定单元格,它将打开一个表单并相对于该行拉取数据。在该表单上,您可以从列表框中选择可能引用datagridview中的一个或多个项目(行)的项目。如果选中一个复选框,它将返回到datagridview并从列表框中减去确定的金额。这一切都很有效 - 第一关。当您再次执行此操作时,要添加另一个框,它将再次减去新数据和旧数据。这是下面列出的代码。

orderDeduct = ShipDB.GetDeduction(dailyReq);
List<ItemMaster> deductedReq = new List<ItemMaster>(dailyReqsList);

if (deductedReq[v].Balance == dailyReqsList[v].Balance)
{
    if (orderDeduct.QtyShipped > 0)
    {
        if (deductedReq[v].QtyReqDay1 > 0)
        {
            if (orderDeduct.QtyShipped >= DeductedReq[v].QtyReqDay1)
            {
                orderDeduct.QtyShipped = orderDeduct.QtyShipped – 
                deductedReq[v].QtyReqDay1;
                deductedReq[v].QtyReqDay1 = 0;
            }
            else
            {
                deductedReq[v].QtyReqDay1 = deductedReqv].QtyReqDay1 
                - orderDeduct.QtyShipped;
                orderDeduct.QtyShipped = 0;
            }
        }
    }
    …
    deductedReq[v].Balance = deductedReq[v].QtyOnHand
        - deductedReq[v].QtyCommitted 
        + deductedReq[v].QtyReqDay1 + deductedReq[v].QtyReqDay2
        + deductedReq[v].QtyReqDay3 + deductedReq[v].QtyReqDay4
    …
}

代码遵循了七天,就像我上面说的那样,在第一遍中效果很好。问题是当你再次使用该方法时,我想到了这一行

List<ItemMaster> deductedReq = new List<ItemMaster>(dailyReqsList);

会制作原始列表的副本,我会将其用作运行总计列表,如果它们不相等,我可以与原始列表进行比较。这就是行

的原因
if (deductedReq[v].Balance == dailyReqsList[v].Balance)

我假设将检查从原始列表(dailyReqsList)到deductedReq列表的余额。任何帮助我指向正确方向的人都表示赞赏。

1 个答案:

答案 0 :(得分:0)

就像Sabrina所说,我需要更改ItemMaster类来执行深层复制而不是浅层复制。

我对它进行了以下更改。

public ItemMaster ShallowCopy()
{
    return (ItemMaster)this.MemberwiseClone();
}

public ItemMaster DeepCopy()
{
    ItemMaster clonedItem = (ItemMaster)this.MemberwiseClone();

    clonedItem.Balance = Balance;
    clonedItem.QuantityOnHand = QuantityOnHand;
    clonedItem.QuantityCommitted = QuantityCommitted;
    clonedItem.QuantityAvailable = QuantityAvailable;
    clonedItem.QtyReqDay1 = QtyReqDay1;
    clonedItem.QtyReqDay2 = QtyReqDay2;
    clonedItem.QtyReqDay3 = QtyReqDay3;
    clonedItem.QtyReqDay4 = QtyReqDay4;
    clonedItem.QtyReqDay5 = QtyReqDay5;
    clonedItem.QtyReqDay6 = QtyReqDay6;
    clonedItem.QtyReqDay7 = QtyReqDay7;

    return clonedItem; 
}
然后我改变了行

List<ItemMaster> deductedReq = new List<ItemMaster>(dailyReqsList);

deductedReq = dailyReqList.ConvertAll(ItemMaster => ItemMaster.DeepCopy());

并调用CalculateDeductions(dailyReqList [v])方法。

另外,我更改了List(deductedReq)的范围 - 它是该方法的本地范围,现在它的形式很宽。这是因为它在一种方法中创建并在另一种方法中更新。

我希望这个解释有助于澄清我遇到的问题及其解决方法。