我有一个类Data
在固定的几天内,我想保存一些 Data
的列表对象。
我可以这样做:List<List<Data>>
或 List<Data>[amount]
或 Dictionary<DateTime, List<Data>>
或者我想要的任何东西。
例如,我有从 1.1.2000 到 4.1.2000 的数据。
我现在想将它移动到:2.1.2000 到 5.1.2000(将来一天移动)
所以我必须删除第一个并移动并在最后添加新数据。
我还需要另一种方式:31.12.1999 到 3.1.2000(过去一天)
现在我必须删除最后一个并在开头移动和插入新数据。
我的问题:我在从该结构读取数据时异步加载数据。我希望(几乎)每次都可以读取数据。
所以。什么是最好的方法?当我填充数据时,数组是最快的方法。 List<List<Data>>
也很好,字典非常慢(在我的测试中,首先是大约 0.5 秒,而 Dic 大约是 2 秒)。
但是当我想移动那个数组时,我无法读取,因为我还没有准备好移动数据。当我使用列表时,我不必触及中间部分(只需先删除并在末尾添加;更快?)并且使用字典我可以随时访问?
数据保存了大约 10.000 个数据集,我通常在一个列表中有大约 10 个数据元素。我有大约 3-4 天的时间加载。
编辑:
目标是用 mschart 在图表中显示部分数据。我读取文件,将它们加载到我的结构中(我的 List<List<Data>>
或其他)并将数据转换为 Charting.DataPointCollection
并让图表显示它(直接转换数据并持有 DataPointCollection
而不是 Data
似乎没有成功,请在此处查看我的问题:Charting.DataPointCollection how to get a Range? )
当我想获得一些信息时2.1.2000 8:00 到 10:00,我在我的一天的结构中搜索(我搜索正确的 List<Data>
)然后我选择正确的数据集(在 List<Data>
中搜索)然后我搜索正确的Data
中的数据点.
我收集它们并应用一些算法来减少数据点(例如 Douglas-Peucker)。之后,我将数据提供给图表。
当我只加载没有结构的数据点时,我的图表太慢了。
为了让用户能够继续前进(无需等到数据加载完毕),我需要预加载数据。这就是为什么我多几天加载异步的原因。
在这种情况下,用户可以移动,当需要相邻的一天时,我可以显示预加载的数据并在下一个需要的日子异步加载。
最佳答案
更新
事实证明,您要查找的内容有一个名称:双端队列。 Deque是double-ended queue的简称,一种两端都可以插入/移除的队列。
我实现了:
- 并发无锁
ConcurrentDeque<T>
两端都有 Peek、Pop 和 Push 操作,这似乎非常适合您的需求; - 和一个更简单的非并发
Deque<T>
.
您可以在 GitHub 上找到来源(请随意贡献)和此处的 NuGet 包:https://www.nuget.org/packages/DequeNET/
旧答案
听起来像是对 ConcurrentQueue<T>
的完美描述,线程安全的 FIFO(先进先出)数据结构。
使用 Enqueue
将一个项目添加到队列的后面,并且 TryDequeue
删除队列的头部。
其他线程仍然可以遍历集合:GetEnumerator
实现返回调用时集合的快照。
字典绝对不是个好主意。看起来您希望按插入顺序对项目进行排序:字典(哈希表)不保证元素的顺序。
关于c# - 保存数据列表并在更改数据列表时使它们可读的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20634953/