更新foreach循环内的主词典

时间:2014-03-07 10:56:48

标签: c# list dictionary

我有一个<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??
}

3 个答案:

答案 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是引用对象,您对ListkeyValuePair.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迭代时无法删除字典条目。相反,您应该复制字典并从中删除相应的条目,而不是从原始条目中删除。