我对用于数据的集合有点怀疑。
域名是这样的(例子):
对于每个超市,我们每次向任何客户在注册处付款时,都会向集合中添加一个新项目,其中包含时间戳和总金额。
我们目前这样做:
我们有一个带有key = UniqueSupermarketID的词典集合,值是一个List< {timestamp,amount}>
每次客户付款时,我们只需在特定超市的集合中添加新商品。
我们需要以下列方式从这本词典中提取数据:
对于指定的超市,获取时间戳等于“某个时间戳”的最新收银台对象
我们目前这样做:
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 丹麦哥本哈根
答案 0 :(得分:1)
编辑:基于更新
好的,看到你真正需要的东西肯定有助于做出正确的决定。如果您的数据已经按顺序排列,则不需要排序的集合,您的四个用法可以减少到一个 - &gt;
搜索符合某些条件的项目
尝试使用PLINQ并仔细测量它对LINQ的执行方式。有这么多条目,差别应该很好。
_states.AsParallel().FirstOrDefault(...);
它只会在后台创建几个线程,每个线程都会搜索集合的某些部分,最后会合并结果。 .NET框架应该为您选择最佳线程数,但是如果您想尝试,请使用.WithDegreeOfParallelism(x)
,其中x
是将使用的线程数。