gpt4 book ai didi

c# - 使用递归从 IDictionary 中删除项目

转载 作者:行者123 更新时间:2023-11-30 13:21:32 26 4
gpt4 key购买 nike

有人有更巧妙的方法来做到这一点吗?似乎它应该比这更容易,但我有一个精神障碍。基本上我需要从字典中删除项目并递归到也是字典的项目的值。

private void RemoveNotPermittedItems(ActionDictionary menu)
{
var keysToRemove = new List<string>();
foreach (var item in menu)
{
if (!GetIsPermitted(item.Value.Call))
{
keysToRemove.Add(item.Key);
}
else if (item.Value is ActionDictionary)
{
RemoveNotPermittedItems((ActionDictionary)item.Value);
if (((ActionDictionary)item.Value).Count == 0)
{
keysToRemove.Add(item.Key);
}
}
}
foreach (var key in (from item in menu where keysToRemove.Contains(item.Key) select item.Key).ToArray())
{
menu.Remove(key);
}
}

Action 字典是这样的:

public class ActionDictionary : Dictionary<string, IActionItem>, IActionItem

最佳答案

如果您反向迭代字典(从“menu.Count - 1”到零),您实际上不需要收集键并再次迭代它们。当然,如果您开始删除内容,则按前向顺序迭代会产生变异的集合异常。

我不知道 ActionDictionary 是什么,所以我无法测试您的确切场景,但这是一个仅使用 Dictionary<string,object> 的示例.

    static int counter = 0;
private static void RemoveNotPermittedItems(Dictionary<string, object> menu)
{
for (int c = menu.Count - 1; c >= 0; c--)
{
var key = menu.Keys.ElementAt(c);
var value = menu[key];
if (value is Dictionary<string, object>)
{
RemoveNotPermittedItems((Dictionary<string, object>)value);
if (((Dictionary<string, object>)value).Count == 0)
{
menu.Remove(key);
}
}
else if (!GetIsPermitted(value))
{
menu.Remove(key);
}
}
}

// This just added to actually cause some elements to be removed...
private static bool GetIsPermitted(object value)
{
if (counter++ % 2 == 0)
return false;
return true;
}

我还颠倒了“if”语句,但这只是一个假设,即您希望在调用方法以对项目的值进行操作之前进行类型检查……假设“GetIsPermitted”始终以任何一种方式工作为 ActionDictionary 返回 TRUE。

希望这对您有所帮助。

关于c# - 使用递归从 IDictionary 中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/235446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com