选择正确的排序集合

时间:2013-11-20 09:12:18

标签: c# collections dictionary

我对用于数据的集合有点怀疑。

域名是这样的(例子):

对于每个超市,我们每次向任何客户在注册处付款时,都会向集合中添加一个新项目,其中包含时间戳和总金额。

我们目前这样做:

我们有一个带有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 丹麦哥本哈根

1 个答案:

答案 0 :(得分:1)

编辑:基于更新

好的,看到你真正需要的东西肯定有助于做出正确的决定。如果您的数据已经按顺序排列,则不需要排序的集合,您的四个用法可以减少到一个 - &gt;

搜索符合某些条件的项目

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

尝试使用PLINQ并仔细测量它对LINQ的执行方式。有这么多条目,差别应该很好。

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

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