更新指定列表项位置的List元素

时间:2010-02-23 21:38:12

标签: c#

我正在尝试这样做:

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

但是因为setwring变量是readonly,所以我不能覆盖它。

我也想做这样的事情

foreach (Settings sets in MySets)
{

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

我怎样才能做到这一点?列表有一个非常好的Add()方法,但是他们忘了其余的:(

2 个答案:

答案 0 :(得分:2)

您可以使用:

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

删除满足特定条件的所有项目。

如果您想在不触及原始列表的情况下获取满足条件的所有项目,可以尝试:

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

foreach循环在此处不起作用,因为尝试更改基础列表将在循环的下一次迭代中导致异常。当然,您可以使用for循环并手动索引列表。但是,您应该非常小心,不要错过从列表中删除项目的过程中的任何项目(因为如果删除元素,所有以下项目的索引将减少):

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

答案 1 :(得分:0)

你不能在'常规'for循环中这样做吗?