繁体   English   中英

选择正确的分类集合

[英]Choosing the right sorted collection

对于将哪个集合用于我们的数据,我有些怀疑。

域是这个(示例):

对于每个超级市场,我们都会向集合中添加新商品,并带有时间戳和每次客户在收银机上付款时的总金额。

我们目前正在这样做:

我们有一个Dictionary集合,其键为= UniqueSupermarketID,其值为List <{timestamp,amount}>

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

我们需要以以下方式从此字典中提取数据:

对于指定的超级市场,获取最新的收银机对象,其时间戳等于“ some timestamp”

目前,我们这样做是:

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

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

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

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

2014年1月3日更新:

当前,该列表中大约有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);

谢谢,

/丹麦丹麦哥本哈根

编辑:基于更新

好吧,看到您真正需要的东西有助于做出正确的决定。 如果您的数据已经整理好了,那么就不需要分类收集了,您的四种用法可以减少为一种->

搜索符合某些条件的一项

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

尝试使用PLINQ,并仔细评估其对LINQ的性能。 有这么多的条目,区别应该很好。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM