[英]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 相同的项目添加到网格中。
我认为它不断添加相同的项目,但为什么呢? 有人能解释一下吗?
您总是通过索引零不断访问。 修正选项:
如果您使用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); }
如果您使用 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); }
那么用户属性初始化器会更好:
foreach (var material in materialUsed) { deliveredTaskModel.Add(new DeliveredTaskModel { Info = material.SubPartCode, Description = material.Description, Qty = material.Qty }); }
然后使用 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.