2017-04-24 29 views
4

我有我的简单的foreach问题。我试图从数据库中获取数据到我的列表中。C#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时,它只是将相同的项目添加到网格的4倍。

我认为它不断添加相同的项目,但为什么?有人可以解释吗?

+1

使用'material'而不是'materialUsed [0]'这是第一个系统。 –

+2

你总是访问'materialUsed'集合的第一个元素。因此,你应该检查material使用'null' 而不是'0' – Nino

回答

10

你总是通过指数零访问不断。选项纠正:

  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. 如果您使用索引改变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(model => new DeliveredTaskModel 
        { 
         Info = material.SubPartCode, 
         Description = material.Description, 
         Qty = material.Qty 
        }).ToList(); 
    

实现它,我建议你去的最后一个选项:)

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

+1

。我假设收集不为空,并没有空项目 – WhileTrueSleep

+0

@WhileTrueSleep - true,而不是'materialUsed [0]'使用变量'material'在'foreach'循环中声明 –

3

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

deliveryModel.Info = materialUsed[0].SubPartCode; 

您需要使用循环变量:

deliveryModel.Info = material.SubPartCode; 
2

你应该在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); 
      } 
     } 
0
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]是列表的第一个项目,whetever项目列表中有你需要永远是第一位的号码,你应该把当前项目“材料”