我正在尝试这样做:
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()方法,但是他们忘了其余的:(
答案 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循环中这样做吗?