2010-03-09 59 views
3

我有几个中型数据集在内存中,我需要能够快速筛选和查找信息。数据集足够小,我不希望每次需要输入时都会遇到去数据库的性能问题,但足够大,我真的需要以某种方式对数据进行索引。从内存数据集中筛选和查找

目前,我将POCO对象与一个或多个词典用于索引。当我需要通过特定键找到某些内容时,这非常适用,但有时情况并非如此。作为一个例子,我经常需要在特定的日期时间范围内找到一个条目。有时我需要最低价格的入场券。大多数情况下,查询会同时查看几个简单的键和一个或两个其他字段。

是否有任何工具,产品,库(针对.NET框架),可以帮助我呢?或者我需要拿起那些尘土飞扬的旧算法书,并开始寻找搜索树?

一个例子:

旅行

  • DepartureCode
  • DestinationCode
  • HotelCode
  • RoomCode
  • 日期
  • 价格

我需要查询,以类似“让我2010-03-09 2010-03-12与之间最便宜的旅行,其中DepartureCode = LAX DestinationCode = NYC”

+0

出于好奇,你有没有尝试过使用DataView?在这个问题中的讨论似乎表明,它与DataGrid相比可以非常快速地执行过滤器和搜索:http://stackoverflow.com/questions/722095/c-dataset-index – 2010-03-10 13:24:41

+0

我认为我原本是尝试过,但是我一次只能在一列上创建索引。 – CodingInsomnia 2010-03-11 15:30:21

回答

2

“最低价”和“特定日期/时间范围”都可以使用排序后的集合和二进制搜索来处理。SortedList/SortedDictionary(或SortedSet如果您使用的是.NET 4.0)可能会在这里完成您所需要的一切,只需要相当少的工作量。

+0

我会仔细研究这些。然而,我认为,当我需要先看一些按键,然后在特定范围内时,他们可能无法解决问题。我用一个例子编辑了这个问题。 – CodingInsomnia 2010-03-09 15:59:59

+0

@andlju:我强烈怀疑,如果没有很多工作,你就不会非常容易地优化这种查询。在您使用一个(或者两个)键之后 - 例如“找到从洛杉矶到纽约的所有旅程”,你是否还有很多旅程需要完成? – 2010-03-09 16:15:06

+0

这是一个很好的观点。在这种情况下,我仍然会有非常多的旅行,但这个例子有点极端,并且不太现实。在大多数情况下,我可能会在对按键应用过滤器后留下一组更合理的条目。 – CodingInsomnia 2010-03-09 17:10:14

0

怎么样的数据集。表(“YourTable”).Select()方法?

Dim myRows() as DataRow = myDataSet.Tables("myTable").Select("Date>" & _ 
    myBeginDate & "AND Date<" & myEndDate) 

编辑:MSDN

数据视图施工

的数据视图建立在基础DataTable的 数据时创建 两个数据视图的指标,当 的Sort,RowFilter或RowStateFilter 属性被修改。在创建一个DataView对象时,请使用DataView构造函数,该构造函数将Sort, RowFilter和RowStateFilter值 作为构造函数参数(以及 底层DataTable)。结果 是索引建立一次。创建 “空的”DataView并设置 Sort,RowFilter或RowStateFilter 属性以后的结果 索引至少要构建两次。

所以,如果你想索引你的DataSet,它看起来像一个DataView可以为你提供。

+0

这是查询的好方法(尽管我更喜欢LINQ),但它不会被索引,对吗? – CodingInsomnia 2010-03-09 15:53:18

+0

我明白你的意思了。我想我误解了这个问题。 – 2010-03-09 15:59:53

+1

不幸的是,我不认为可以在数据视图中创建多个索引,并且一个索引对于使用字典或排序列表创建足够简单。我很想在这方面被证明是错误的,但我没有真正研究过这么多.. – CodingInsomnia 2010-03-11 15:32:37