我对使用哪一组数据表示怀疑。
域是这样(例如):
对于每一家超市,我们都会在集合中添加一个新项目,并在每次任何客户在登记时付款时,都要加上时间戳和总金额。
我们目前这样做:
我们有一个包含key = UniqueSupermarketID的字典集合,值是List<{时间戳,List<}>
每次客户付款时,我们只需在特定超市的集合中添加一个新项目。
我们需要从本词典中提取数据,方法是:
对于指定的超市,获取最新的收银机对象,其时间戳等于“一些时间戳”。
我们目前这样做是为了:
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);
谢谢,
丹麦哥本哈根/Jesper
发布于 2013-11-20 12:25:01
编辑:基于更新的
好吧,看到你真正需要的帮助你做出正确的决定。如果您的数据已按顺序排列,则不需要排序集合,并且您的四种用法可以简化为一个->。
搜索与某些条件匹配的项。
尝试使用PLINQ,并仔细测量它对LINQ的性能。有这么多条目,差别应该很大。
_states.AsParallel().FirstOrDefault(...);
它只会在后台创建几个线程,每个线程都将搜索集合的某些部分,并最终合并结果。.NET框架应该为您选择最佳的线程数,但是如果您想尝试,那么可以选择.WithDegreeOfParallelism(x)
,其中x
是它将要使用的线程数。
https://stackoverflow.com/questions/20091619
复制相似问题