Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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# 管理大型收藏的好方法_C#_Collections_Linked List - Fatal编程技术网

C# 管理大型收藏的好方法

C# 管理大型收藏的好方法,c#,collections,linked-list,C#,Collections,Linked List,我试图想出一种快速有效的方法来处理大量相同结构类型的项,在这种方法中,数组可以随时间增长,并在条件合适时快速、有选择性地删除项 该应用程序将以相对较快的速度输入大量数据,我需要快速分析它,更新一些UI信息,删除旧的数据点,为新的数据点腾出空间。有一些我感兴趣的数据点需要比其他数据点保留更长的时间 数据有效载荷包含2个整数,表示物理频谱数据:频率、功率等。“过时”只是一些元数据,我将使用它们来确定何时是删除旧数据的好时机 我认为使用LinkedList将是一个不错的选择,因为它可以轻松地从集合的中

我试图想出一种快速有效的方法来处理大量相同结构类型的项,在这种方法中,数组可以随时间增长,并在条件合适时快速、有选择性地删除项

该应用程序将以相对较快的速度输入大量数据,我需要快速分析它,更新一些UI信息,删除旧的数据点,为新的数据点腾出空间。有一些我感兴趣的数据点需要比其他数据点保留更长的时间

数据有效载荷包含2个整数,表示物理频谱数据:频率、功率等。“过时”只是一些元数据,我将使用它们来确定何时是删除旧数据的好时机

我认为使用LinkedList将是一个不错的选择,因为它可以轻松地从集合的中间删除项,但我需要能够执行以下伪代码:

for(int i = 0; i < myCollection.Length; i++)
{
    myCollection[i].AgeOutVal--;

    if(myCollection[i].AgeOutVal == 0)
    {
       myCollection.Remove(i);
       i--;
    }
}
for(int i=0;i

但是我得到了编译器错误,表明我不能使用这样的集合。做这件事的好/快方法是什么?

我建议您首先对程序进行认真的性能分析。每秒处理一百万个项目只会为每个项目留下几千个周期,这当然是可行的。但是,有了这种性能目标,您的性能将受到数据位置和由此产生的缓存未命中等因素的严重影响

其次,我建议您将“是否需要从队列中删除此对象”的关注点与对象本身表示的关注点分开

第三,你没有说“年龄”字段能有多大,只是说它在倒计时。每次通过循环对整个集合进行变异,只是为了找到要删除的集合,这似乎效率低下。一些想法:

  • 假设“年龄”从十倒计时到零。不要创建一个集合,集合中的每个项目都有一个期限,而是创建十个集合,一个集合用于在一个集合中超时的项目,一个集合用于在两个集合中超时的项目,依此类推。每次勾选时,您都会扔掉“一次超时”集合,然后“两次超时”集合变成“一次超时”集合,依此类推。每次通过循环时,只需移动少量集合引用,而不是改变大量项

  • 为什么“年龄”倒计时?时间在增加。根据每个项目的创建时间对其进行标记,切勿更改。使用队列,以便可以在一端插入新项目,并从另一端删除它们。因此,队列将按年龄排序。每次勾选,将太旧的项目从队列中排出,直到找到一个不太旧的项目。正如其他地方提到的,队列的循环缓冲区实现可能是有效的


我建议您首先对程序进行认真的性能分析。每秒处理一百万个项目只会为每个项目留下几千个周期,这当然是可行的。但是,有了这种性能目标,您的性能将受到数据位置和由此产生的缓存未命中等因素的严重影响

其次,我建议您将“是否需要从队列中删除此对象”的关注点与对象本身表示的关注点分开

第三,你没有说“年龄”字段能有多大,只是说它在倒计时。每次通过循环对整个集合进行变异,只是为了找到要删除的集合,这似乎效率低下。一些想法:

  • 假设“年龄”从十倒计时到零。不要创建一个集合,集合中的每个项目都有一个期限,而是创建十个集合,一个集合用于在一个集合中超时的项目,一个集合用于在两个集合中超时的项目,依此类推。每次勾选时,您都会扔掉“一次超时”集合,然后“两次超时”集合变成“一次超时”集合,依此类推。每次通过循环时,只需移动少量集合引用,而不是改变大量项

  • 为什么“年龄”倒计时?时间在增加。根据每个项目的创建时间对其进行标记,切勿更改。使用队列,以便可以在一端插入新项目,并从另一端删除它们。因此,队列将按年龄排序。每次勾选,将太旧的项目从队列中排出,直到找到一个不太旧的项目。正如其他地方提到的,队列的循环缓冲区实现可能是有效的


结构不应该是可变的。您使用的类型几乎肯定是类,而不是结构。更不用说删除项时,当
i
继续增加到旧的长度时,您将跳过下一个,并在集合末尾运行。您会遇到哪些编译器错误。您可能需要进一步解释您的预期使用模式。结构数组对于随机和顺序访问以及紧凑的内存布局都具有非常好的性能。也适用于将项目附加到末尾。不要太多,如果你需要删除中间的元素。其他数据结构(例如优先级队列)可能更适合您的特定用例。我们无法判断,因为您的问题中没有足够的信息。您可能希望使用(1)一个优化的结构来接收流并顺序处理它(例如,环形缓冲区)(2)另一个结构来存储您需要“保留”的“点”。同样,如果你在问题中把你的预期用途说得更清楚,你会得到更好的答案。我建议您这样做,并添加您的具体使用场景