【问题标题】:Choosing the right sorted collection选择正确的排序集合
【发布时间】:2013-11-20 09:12:17
【问题描述】:

我有点怀疑要为我们的数据使用哪个集合。

域是这样的(示例):

对于每个超市,我们会在每次任何客户在收银台付款时将新商品添加到带有时间戳和总金额的集合中。

我们目前这样做:

我们有一个字典集合,键 = UniqueSupermarketID,值是一个列表

每次客户付款时,我们只需将新商品添加到特定超市的收藏中即可。

我们需要从这个字典中提取数据:

对于指定超市,获取时间戳等于“某个时间戳”的最新收银对象

我们目前这样做:

supermarketDictionary["supermarket_01"]
    .OrderByDescending(i => t.TimeStamp)
    .FirstOrDefault(i => i.TimeStamp == 'some timestamp')

这显然很快就开始表现得像废话 - 所以我试图找出将数据存储在哪个集合中。

我正在考虑使用普通字典来保存“超市 id 收银机列表”关系,并使用 SortedDictionary 作为时间戳/用作键的金额。

这是正确的方法吗?我当然需要在时间戳上正确实现 IComparable 以使其正常工作。

2014-01-03 更新:

当前列表中有大约 700 万行。我们系统中列表的用途已确定如下:

_states
    .OrderBy(x => x.TimeStamp)
    .FirstOrDefault(x => x.WtgId == wtgId && x.IsAvailable && x.TimeStamp >= timeStamp);

_states
    .Where(x => x.WtgId == wtgId && x.IsAvailable && x.TimeStamp >= timeStamp && x.TimeStamp <= endDateTime)
    .OrderBy(x => x.TimeStamp).ToList();

_states.Remove(state);

if (!_states.Contains(message))
    _states.Add(message);

谢谢,

/杰斯珀 丹麦哥本哈根

【问题讨论】:

  • 如果您使用大量数据,请使用数据库。这是唯一可扩展且合理的方式,然后只加载您需要的数据。
  • 您的数据实际存储在哪里?在数据库中?如果有,是什么样的?
  • 我假设你背后有一个数据库。因此,让数据库为您完成这项工作。
  • @dev Hedgehog:我怀疑他们背后有数据库。否则他们不会使用字典来保存客户付款,而是直接将其添加到数据库中。要么没有数据库,要么设计不好;)
  • 另外,为什么要排序然后遍历集合以寻找特定的时间戳?为什么不直接查找时间戳而不进行排序?

标签: c# collections dictionary


【解决方案1】:

编辑:基于更新

好吧,看看你真正需要什么肯定有助于做出正确的决定。如果您的数据已经按顺序排列,则不需要排序集合,并且您的四种用途可以减少到一种 ->

搜索符合某些条件的项目

  • 添加存在检查 - 添加是非排序集合中的一种廉价操作,存在检查只是搜索一个项目
  • 按项目删除最多也是通过集合加上删除操作本身,这也很便宜(但如果多次执行,则不在数组中)

尝试使用 PLINQ 并仔细衡量它对 LINQ 的执行情况。有这么多条目,差异应该很好。

_states.AsParallel().FirstOrDefault(...);

它只会在后台创建几个线程,每个线程都会搜索集合的某些部分,最后将结果合并。 .NET 框架应该为您选择最佳的线程数,但如果您愿意尝试,可以添加.WithDegreeOfParallelism(x),其中x 是它将使用的线程数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2020-11-25
    • 2015-08-22
    • 2021-09-01
    相关资源
    最近更新 更多