Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FIFO的最佳收集对象和按位置查看项目的能力_C#_.net_Data Structures_Collections - Fatal编程技术网

C# FIFO的最佳收集对象和按位置查看项目的能力

C# FIFO的最佳收集对象和按位置查看项目的能力,c#,.net,data-structures,collections,C#,.net,Data Structures,Collections,我正在寻找一个集合对象/策略,它可以允许FIFO,并允许我通过简单地指定它们的位置来查看集合中的项目。澄清: 我希望这个数据结构能够容纳100个DTO对象,然后当它达到101个时,我可以通过删除第一个项目来腾出空间,等等(FIFO) 我希望能够在收到请求时返回这些对象中最新的x 我尝试使用.Net队列对象,但据我所知,它不支持#2,尽管我可能忽略了其中的某些内容。当您要从队列中弹出项目时,包装列表并执行RemoveAt(0)并不难。这将给你先进先出,让你在任何你想索引。您可能应该包装它以保护队列

我正在寻找一个集合对象/策略,它可以允许FIFO,并允许我通过简单地指定它们的位置来查看集合中的项目。澄清:

  • 我希望这个数据结构能够容纳100个DTO对象,然后当它达到101个时,我可以通过删除第一个项目来腾出空间,等等(FIFO)

  • 我希望能够在收到请求时返回这些对象中最新的x


  • 我尝试使用.Net队列对象,但据我所知,它不支持#2,尽管我可能忽略了其中的某些内容。

    当您要从队列中弹出项目时,包装列表并执行RemoveAt(0)并不难。这将给你先进先出,让你在任何你想索引。您可能应该包装它以保护队列的完整性(仅限FIFO)。

    我快速查看了.NET文档,但没有找到任何满足您需要的内容。看起来您需要自己实现它,尽管这并不太困难。我建议使用适当大小的数组,并为数组中的当前位置保留读写索引,并将其用作循环数组


    Enqueue将把值写入readIndex,然后将readIndex设置为((readIndex+1)%queueSize)。如果readIndex==writeIndex,则Dequeue将引发异常,否则在writeIndex处获取值,然后将writeIndex增加((writeIndex+1)%queueSize)。窥视队列索引(从队列顶部,即最后排队的项目)将返回((queueSize+(readIndex-index))%queueSize)处的项目

    我不会包装列表,因为索引到列表中是一个O(N)操作。听起来OP想要频繁地索引到队列中,所以这是一个很大的问题。数组将为您提供O(1)个任意访问时间。NET中的List-Class,就像List在内部使用数组一样,但是删除项#0对这些类来说是一个O(N)操作,所以开销是一样的,只是不在同一个位置。啊,对,我想的是LinkedList。在这种情况下,在包装器集合类中使用读写索引使OP关心的所有操作都是O(1)。指定100个对象而不是1000000个对象的问题——线性时间删除在这里不是问题。当然,但它也没有指定项目排队或退队的频率。也许这是我的游戏程序员心态,但我更愿意花5-10分钟的额外时间来获得非常快的O(1)。读和写索引对性能的影响可以忽略不计,而使用“原始”方式会在每次出列时产生内存分配和复制。如果这样做,比如说,一帧20次。。。