C# 在指定的列表项位置更新列表元素

C# 在指定的列表项位置更新列表元素,c#,C#,我正在尝试这样做: foreach (Settings sets in MySets) { if (sets.pName == item.SubItems[2].Text) { var ss = new SettingsForm(sets); if (ss.ShowDialog() == DialogResult.OK)

我正在尝试这样做:

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;
                }
            }
但是由于集合派生的变量是只读的,我不能重写它

我也想做这样的事情

foreach (Settings sets in MySets)
{

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

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

您不能在“常规”for循环中执行此操作?

您可以使用:

MySets.RemoveAll(sets => sets.pName == someName);
删除满足特定条件的所有项目

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

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

谢谢。但是如何更新现有列表..类似于:更新设置x where x.name=“john”设置为y,设置为X在…的列表中course@SilentWarrior:如果
设置
是引用类型,则可以使用
foreach
循环构造更改其成员。如果需要更改引用本身或它是值类型,则需要对循环使用索引的
。更新了我的ans我们举个例子。难道没有更漂亮的方法吗?总之,thx为大家:)我想完全放弃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;
   }
}