在C#中是否有可能在编译时创建一个常量字典或数组?
如果不行,那么在C或C++中是否可以这样做并编译成一个dll,以便将其引入到C#项目中?
我需要创建一个大约有1.3亿成员的字典,而合理快速地生成它会消耗很多时间。我想最快的方法是通过编程方式生成一个巨大的文本文件,并将其编译为一个常量数组一次,然后永远不再支付这个代价。但我在C#中找不到这个功能。我觉得我可以在C中做到这一点。
编辑1:如果我没错,这将占用大约1.5GB的RAM。许多有用的评论揭示了这将占据至少这么多磁盘空间作为exe,这可能无法部署。然而,我仍然对对于规模较小的问题的答案感兴趣。
编辑2:了解应用程序可能会回答很多问题。这是一个蒙特卡罗模拟器。一张牌是一个位,从2clubs =0x1到Aspades = (0x1<<52)。一手牌是一个ulong,其中有7位被设置为指示手中的牌。
这种存储方案使我能够使用比逻辑更为麻烦的位操作。例如,要检测同花,我可以屏蔽所有红桃,然后做popcount > 4,然后重复clubs、diamonds和spades。
然后你必须确定一手牌的牌力值。但如果你正在排列牌,这是微不足道的,因为高牌由排列步骤给出。如果你不在排列中间,那么确定等级就会更麻烦。这就是为什么按需生成值是不可取的原因。你必须在某个地方付出代价,但现场费用比前期费用高得多。
最终目标是将它们放入一个字典中,以便确定2手牌中的更好的一手是通过查找字典实现的。
最快的方法(我想到的)是将所有手/等级存储在tuplet数组中,然后执行ToDictionary()。缺点是数组显然没有重复检查。这意味着,在同花顺示例中,我必须检查是否存在同花顺,然后再推送到数组中,而在字典中,我可以先放直接同花顺,然后尝试推送同花。因此,你要么支付检查同花顺的成本,要么支付每次将1个项目推送到字典中的成本。
字典键是所有可能的7张牌扑克牌手。值是每个手的相对强度,例如,从同花顺到ace的值为零。
我需要创建一个大约有1.3亿成员的字典,而合理快速地生成它会消耗很多时间。我想最快的方法是通过编程方式生成一个巨大的文本文件,并将其编译为一个常量数组一次,然后永远不再支付这个代价。但我在C#中找不到这个功能。我觉得我可以在C中做到这一点。
编辑1:如果我没错,这将占用大约1.5GB的RAM。许多有用的评论揭示了这将占据至少这么多磁盘空间作为exe,这可能无法部署。然而,我仍然对对于规模较小的问题的答案感兴趣。
编辑2:了解应用程序可能会回答很多问题。这是一个蒙特卡罗模拟器。一张牌是一个位,从2clubs =0x1到Aspades = (0x1<<52)。一手牌是一个ulong,其中有7位被设置为指示手中的牌。
这种存储方案使我能够使用比逻辑更为麻烦的位操作。例如,要检测同花,我可以屏蔽所有红桃,然后做popcount > 4,然后重复clubs、diamonds和spades。
然后你必须确定一手牌的牌力值。但如果你正在排列牌,这是微不足道的,因为高牌由排列步骤给出。如果你不在排列中间,那么确定等级就会更麻烦。这就是为什么按需生成值是不可取的原因。你必须在某个地方付出代价,但现场费用比前期费用高得多。
最终目标是将它们放入一个字典中,以便确定2手牌中的更好的一手是通过查找字典实现的。
最快的方法(我想到的)是将所有手/等级存储在tuplet数组中,然后执行ToDictionary()。缺点是数组显然没有重复检查。这意味着,在同花顺示例中,我必须检查是否存在同花顺,然后再推送到数组中,而在字典中,我可以先放直接同花顺,然后尝试推送同花。因此,你要么支付检查同花顺的成本,要么支付每次将1个项目推送到字典中的成本。
字典键是所有可能的7张牌扑克牌手。值是每个手的相对强度,例如,从同花顺到ace的值为零。
capacity
的构造函数?这可以加快初始化速度。 - Theodor Zoulias