我有一个<string, List<ESelectionData>>
字典,在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??
}
答案 0 :(得分: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);
}
通常,您应该非常小心这个解决方案,因为字典上的迭代顺序是任意的,因为实现可以自由决定以什么顺序为您提供键值对。由于在处理循环中的其他值之一时决定删除,因此需要确保按照算法所期望的顺序处理值。
编辑:(以回应评论)如果您的目标是修改主词典中存储的列表的内容,则无需执行任何特殊操作:从{{1}开始} s是引用对象,您对List
(keyValuePair.Value
所做的任何修改都会自动反映在List<ESelectionData>
中,因为它们引用同一个对象。
答案 1 :(得分:1)
如果我理解你的问题,你就是在做这样的事情
foreach (KeyValuePair<string, List<ESelectionData>> keyValuePair in inC.MainDictionary)
{
keyValuePair.Value.Remove(...);
}
您不必为此做任何特别的事情,它将从inC.MainDictionary
中移除。由于List<ESelectionData>
是引用类型,因此您实际上正在修改同一个对象。
您可以在此处参考value type vs reference type
答案 2 :(得分:0)
你的字典的每个值都是一个List本身,所以如果(你可能?)想要更新各个ESelectionData对象,你需要一个嵌套的foreach来迭代每个ESelectionData对象中的属性。
第二件事是删除字典条目:在使用foreach迭代时无法删除字典条目。相反,您应该复制字典并从中删除相应的条目,而不是从原始条目中删除。