开发者

Update List element at specified list item position

I am trying to do this:

foreach (Settings sets in MySets)
            {
                if (sets.pName == item.SubItems[2].Text)
                {
                    var ss = new SettingsForm(sets);
                    if (ss.ShowDialog() == DialogResult.OK)
                    {
                        if (ss.ResultSave)
                        {
                            sets = ss.getSettings();
                        }
                    }
                    return;
                }
            }

But since the sets spawned variable is readonly, I cant override it.

I wou开发者_开发百科ld also like to do something like this

foreach (Settings sets in MySets)
{

  if(sets.pName == someName)
     sets.RemoveFromList();
}

How can I accomplish this? Lists have a very nice Add() method, but they forgot the rest :(


You can use:

MySets.RemoveAll(sets => sets.pName == someName);

to remove all the items that satisfy a specific condition.

If you want to grab all the items satisfying a condition without touching the original list, you can try:

List<Settings> selectedItems = MySets.FindAll(sets => sets.pName == someName);

foreach loops don't work here as trying to change the underlying list will cause an exception in the next iteration of the loop. Of course, you can use a for loop and manually index the list. However, you should be very careful not to miss any items in the process of removing an item from the list (since the index of all the following items will get decremented if an element is removed):

for (int i = 0; i < MySets.Count; ++i) {
   var sets = MySets[i]; // simulate `foreach` current variable

   // The rest of the code will be pretty much unchanged.
   // Now, you can set `MySets[i]` to a new object if you wish so:
   //   MySets[i] = new Settings(); 
   //
   // If you need to remove the item from a list and need to continue processing
   // the next item:   (decrementing the index var is important here)
   //   MySets.RemoveAt(i--);
   //   continue;

   if (sets.pName == item.SubItems[2].Text)
   {
      var ss = new SettingsForm(sets);
      if (ss.ShowDialog() == DialogResult.OK)
      {
         if (ss.ResultSave)
         {
            // Assigning to `sets` is not useful. Directly modify the list:
            MySets[i] = ss.getSettings();
         }
      }
      return;
   }
}


You can't do it in a 'regular' for loop?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜