简体   繁体   中英

C# Foreach keep adding the same item to list

I am having issues with my simple foreach. I am trying to get data from the database to my list.

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);
    }
}

when I set a breakpoint on the foreach. I can see that it has 4 different items in materialUsed. however, when I do this foreach, it simply adds 4x the same item to the grid.

I assume it keeps adding the same item, but why? Could someone explain?

You are always accessing by index zero constantly. Options to correct:

  1. If you use foreach use:

     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. If you use by indexer change to 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. Then it will be nicer to user property initializer:

     foreach (var material in materialUsed) { deliveredTaskModel.Add(new DeliveredTaskModel { Info = material.SubPartCode, Description = material.Description, Qty = material.Qty }); }
  4. And then using linq you can achieve it with .Select

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

I suggest you go with the last option :)

One last comment - your if statement (materialUsed.Count > 0) is redundant because if collection is empty it won't go into the loop

You are referencing the same fixed index in your loop:

deliveryModel.Info = materialUsed[0].SubPartCode;

You need to use the loop variable:

deliveryModel.Info = material.SubPartCode;

You should use the current item in each iteration of the foreach loop instead of referencing the list. Try this:

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] is the first item of your list, and whetever the number of items the list has you take always the first, you should take the current item "material"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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