繁体   English   中英

C# Foreach 不断将相同的项目添加到列表中

[英]C# Foreach keep adding the same item to list

我的简单 foreach 有问题。 我正在尝试从数据库中获取数据到我的列表中。

IList<DeliveredTaskModel> deliveredTaskModel = new List<DeliveredTaskModel>();
// lines of code 

if (materialUsed.Count > 0)
{
    foreach (var material in materialUsed)
    {
        var deliveryModel = new DeliveredTaskModel();
        deliveryModel.Info = materialUsed[0].SubPartCode;
        deliveryModel.Description = materialUsed[0].Description;
        deliveryModel.Qty = materialUsed[0].Qty;
        deliveredTaskModel.Add(deliveryModel);
    }
}

当我在 foreach 上设置断点时。 我可以看到它在 materialUsed 中有 4 个不同的项目。 然而,当我执行这个 foreach 时,它只是将 4x 相同的项目添加到网格中。

我认为它不断添加相同的项目,但为什么呢? 有人能解释一下吗?

您总是通过索引零不断访问。 修正选项:

  1. 如果您使用foreach使用:

     foreach (var material in materialUsed) { var deliveryModel = new DeliveredTaskModel(); deliveryModel.Info = material.SubPartCode; deliveryModel.Description = material.Description; deliveryModel.Qty = material.Qty; deliveredTaskModel.Add(deliveryModel); }
  2. 如果您使用 by indexer 更改为for-loop

     for(int i = 0; i < materialUsed.Count, i++) { var deliveryModel = new DeliveredTaskModel(); deliveryModel.Info = materialUsed[i].SubPartCode; deliveryModel.Description = materialUsed[i].Description; deliveryModel.Qty = materialUsed[i].Qty; deliveredTaskModel.Add(deliveryModel); }
  3. 那么用户属性初始化器会更好:

     foreach (var material in materialUsed) { deliveredTaskModel.Add(new DeliveredTaskModel { Info = material.SubPartCode, Description = material.Description, Qty = material.Qty }); }
  4. 然后使用 linq 你可以用.Select实现它

    var deliveredTaskModel = materialUsed.Select(material => new DeliveredTaskModel { Info = material.SubPartCode, Description = material.Description, Qty = material.Qty }).ToList();

我建议你选择最后一个选项:)

最后一条评论 - 您的 if 语句(materialUsed.Count > 0)是多余的,因为如果集合为空,它将不会进入循环

您在循环中引用了相同的固定索引:

deliveryModel.Info = materialUsed[0].SubPartCode;

您需要使用循环变量:

deliveryModel.Info = material.SubPartCode;

您应该在 foreach 循环的每次迭代中使用当前项目,而不是引用列表。 尝试这个:

IList<DeliveredTaskModel> deliveredTaskModel = new List<DeliveredTaskModel>();

        if (materialUsed.Count > 0)
        {
            foreach (var material in materialUsed)
            {
                var deliveryModel = new DeliveredTaskModel();
                deliveryModel.Info = material .SubPartCode;
                deliveryModel.Description = material .Description;
                deliveryModel.Qty = material .Qty;
                deliveredTaskModel.Add(deliveryModel);
            }
        }
IList<DeliveredTaskModel> deliveredTaskModel = new List<DeliveredTaskModel>();
// lines of code 

if (materialUsed.Count > 0)
{
    foreach (var material in materialUsed)
    {
        var deliveryModel = new DeliveredTaskModel();
        deliveryModel.Info = material.SubPartCode;
        deliveryModel.Description = material.Description;
        deliveryModel.Qty = material.Qty;
        deliveredTaskModel.Add(deliveryModel);
    }
}

materialUsed[0] 是列表中的第一项,无论列表中有多少项始终是第一个,您都应该选择当前项“材料”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM