首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择正确的排序集合

选择正确的排序集合
EN

Stack Overflow用户
提问于 2013-11-20 09:12:17
回答 1查看 380关注 0票数 0

我对使用哪一组数据表示怀疑。

域是这样(例如):

对于每一家超市,我们都会在集合中添加一个新项目,并在每次任何客户在登记时付款时,都要加上时间戳和总金额。

我们目前这样做:

我们有一个包含key = UniqueSupermarketID的字典集合,值是List<{时间戳,List<}>

每次客户付款时,我们只需在特定超市的集合中添加一个新项目。

我们需要从本词典中提取数据,方法是:

对于指定的超市,获取最新的收银机对象,其时间戳等于“一些时间戳”。

我们目前这样做是为了:

代码语言:javascript
运行
复制
supermarketDictionary["supermarket_01"]
    .OrderByDescending(i => t.TimeStamp)
    .FirstOrDefault(i => i.TimeStamp == 'some timestamp')

这显然很快就会像垃圾一样开始执行--所以我正在尝试找出哪一个集合来存储数据。

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

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

更新2014-01-03:

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

代码语言:javascript
运行
复制
_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);

谢谢,

丹麦哥本哈根/Jesper

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-20 12:25:01

编辑:基于更新的

好吧,看到你真正需要的帮助你做出正确的决定。如果您的数据已按顺序排列,则不需要排序集合,并且您的四种用法可以简化为一个->。

搜索与某些条件匹配的项。

  • 在未排序的集合中,使用存在性检查添加是一种廉价的操作,而存在性检查只是搜索一项。
  • 移除by项最多也是通过一个集合加上remove操作本身,这也是相当便宜的(不过,如果多次在数组中完成的话)

尝试使用PLINQ,并仔细测量它对LINQ的性能。有这么多条目,差别应该很大。

代码语言:javascript
运行
复制
_states.AsParallel().FirstOrDefault(...);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20091619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档