2010-02-23 29 views
0

更新列表元素我試圖做到這一點:在指定列表項位置

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()方法,但他們忘了休息:(

回答

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

謝謝。 但是我怎麼更新現有列表...是這樣的: 更新設置x其中x.name =「約翰」有則設置y 而且,設置X是列表...當然 –

+0

@SilentWarrior內:如果'Setting'是一個引用類型,你可以用'foreach'循環結構來更改它的* members *。如果你需要改變引用本身,或者如果它是一個值類型,你需要求助於一個索引的'for'循環。用一個例子更新我的答案。 –

+0

沒有任何更漂亮的做法嗎? 反正thx所有:) –

0

不能爲循環做一個「常規」

+1

我想完全放棄for循環,不漂亮 –