【问题标题】:How to remove element from dictionary when removed from incoming JSON从传入的 JSON 中删除时如何从字典中删除元素
【发布时间】:2017-12-20 12:13:48
【问题描述】:

我有服务器,以这种 JSON 格式每滴答声(10/秒)向客户端(C# - Unity3D)发送 JSON 数据:

{ 
"bullets": {
  "123": {
    "x" : 1.23,
    "y": 23.4
  },
  "234": {
   same...
  }
  ...
}

我所拥有的是,当它们不在字典中时,我将它们添加到字典中。当它们在字典中时,我只是更新 xy 位置。

我还需要一件我不知道怎么做的东西。我需要删除所有不在 JSON 收入中的项目符号。这意味着,当子弹在服务器上被删除时,服务器只是停止发送这个子弹的位置,客户端必须将它从他的字典中删除(当然也从场景中删除,但这不是问题)。

那么有一些方法可以在不使用服务器向客户端发送消息的情况下实现这一点,那个子弹被删除了吗?我的意思是,这只是逻辑问题,但我真的不知道该怎么做。

【问题讨论】:

  • 您可以拥有从字典键 (listA) 获得的项目符号列表。然后迭代 json 以获取项目符号,在 listA 中检查它,如果存在,将其移动到新的 listB 中。如果不存在,请将其添加到新列表 B。最后,你有 listA 和一个死子弹列表,listB 是来自服务器的活动子弹列表。然后你可以重建你的字典。
  • 但是我认为如果字典中的子弹数是'n'并且JSON中的子弹数是'm',我会得到O(n * m)。当我每秒执行 10 倍(计划为 20 秒)时,这是个坏主意
  • 这将是 O(m) 因为你只运行 json 字典。我只是不明白你为什么要存储它们。只需运行并更新。而已。特别是如果像您所说的那样自动处理删除的那些。

标签: c# json unity3d


【解决方案1】:

您解析 JSON 并将所有项目符号添加到 ArrayList 中。 因此,您将拥有一个列表,您可以说“AllowedList”。然后,您将在字典中添加所有键值,最后使用 Enumerable.Except

删除 AllowedList 中不存在的键值
foreach (var key in MyDictionary.Keys.Except(AllowedList).ToList()){
            MyDictionary.Remove(key);
    }

ToList() 创建集合差异的新列表并防止异常。在此之后,您的字典将只包含服务器上的那些条目。

【讨论】:

  • 像魅力一样工作!多谢兄弟。就这么说出来:没有Linq有什么简单的方法吗?因为我已经锁定了我的大脑,Linq 很慢,在游戏中表现不佳。
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
相关资源
最近更新 更多