c# - 保存数据列表并在更改数据列表时使它们可读的最快方法

标签 c# data-structures

我有一个类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/

相关文章:

c# - 多部分/表单数据请求为空

c# - 即使我只关心它的流,我是否必须存储 TcpClient?

c# - .Net Core MVC 应用程序的图像调整大小、裁剪、旋转库

algorithm - 如何最佳地返回一个短语是否出现在单词流中?

data-structures - 链表和流在技术上有什么区别?

c# - 使用 Shims 对 ZipFile 进行单元测试

c - 将结构插入链表不会显示为正确的节点

java - 在 Java 中,如何查看 PriorityQueue 中的前 k 个元素?

algorithm - 我们应该如何设计/编写一个连接池

c# - 用于累积 list<list<double>> 中的值的代码的并行版本