2014-03-07 19 views
0

我有一個<string, List<ESelectionData>>字典,並在foreach循環中遍歷該字典中的每個值。更新foreach循環內的主要字典

所以我想要的是在foreach循環中,列表中的一些值將被刪除,我希望它也可以從主字典中刪除。

foreach (KeyValuePair<string, List<ESelectionData>> keyValuePair in inC.MainDictionary) 
{ 
    // some calculations 

    // here there are some values from the list of "keyValuePair" removed 
    // so I want to reflect that in the main dictionary "inC.MainDictionary" 

    // How can it be done?? 
} 

回答

1

您無法修改正在迭代的字典。

ISet<string> toDelete = new HashSet<string>(); 
// This example uses LINQ to ignore keys marked for deletion 
foreach (var keyValuePair in inC.MainDictionary.Where(p => !toDelete.Contains(p.Key))) { 
    if (some_condition) { 
     toDelete.Add(anotherKey); 
    } 
} 
foreach (var key in toDelete) { 
    inC.MainDictionary.Remove(key); 
} 

:相反,當您與循環中完成,你可以創建一組鍵忽略,添加的「刪除」項鍵給它,不理會他們,當您去,最後從字典中刪除它們的一般來說,你應該對這個解決方案非常小心,因爲字典上的迭代順序是任意的,因爲實現可以自由決定以什麼順序給你鍵值對。由於決定刪除是在處理循環中的其他值時進行的,因此您需要確保按照算法期望的順序處理這些值。

編輯:(響應評論)如果你的目標是要修改存儲在主詞典裏面列出的內容,你不需要做什麼特別的:因爲List s爲參考對象,任何修改您對keyValuePair.Value(這是一個List<ESelectionData>會自動反映在inC.MainDictionary,因爲它們指的是同一個對象。

+0

他不想從字典*中刪除項目,而是從字典中的*列表*中刪除一個項目。爲此,他不必做任何事情 - 這是一個參考。 –

+1

@ThorstenDittmar我不是100%確定 - 列表是引用類型,所以直接從它們中刪除項目是一件非常簡單的事情 - 不值得發佈Stack Overflow問題。可能會給他帶來問題的唯一任務是刪除一個密鑰。 – dasblinkenlight

+0

*這裏有一些值從「keyValuePair」列表中刪除* - 也許他的代碼做了一些奇怪的事情,但這是我從問題中讀到的。如果我認爲答案是肯定的,那麼在發佈之前他肯定沒有嘗試過任何東西。如果那不是答案,那麼這個問題應該關閉,因爲*沒有足夠的細節*。 –

1

如果我理解你的問題,你正在做這樣的事情

foreach (KeyValuePair<string, List<ESelectionData>> keyValuePair in inC.MainDictionary) 
{ 
    keyValuePair.Value.Remove(...); 
} 

你不必爲此做任何特殊的事情,它將從inC.MainDictionary中刪除。由於List<ESelectionData>是一種參考類型,因此您實際上正在修改同一個對象。

你可以參考這裏value type vs reference type

+0

+1來發現真正的答案。 –

+1

@VishalSuthar如果這是答案,我會降低你的問題:你甚至在發佈之前嘗試過任何東西嗎? – Askolein

0

你的字典的每個值是一個列表本身,所以如果(你也許?)要更新的個人ESelectionData對象,你會以迭代需要一個嵌套的foreach覆蓋每個ESelectionData對象中的屬性。

第二件事是刪除字典條目:在用foreach迭代它時,不能刪除字典條目。相反,您應該複製字典並從中刪除相應的條目,而不是從原始條目中刪除。