什么是搜索和过滤ObservableCollection的有效方法

时间:2010-03-04 09:09:12

标签: wpf search mvvm filter observablecollection

我有一个包含大约100万条记录的数据库。我的应用程序对这些记录进行频繁的增量搜索并过滤UI列表。这种情况更像是“电话联系人搜索” 目前我正在关注此事:

  
      
  1. 将数据加载到DataSource Layer中的List<myModel>
  2.   
  3. 将其发送至MainViewModel
  4.   
  5. List<myModel>加载到ObservableCollection<myViewModel>   (绑定到ListView)
  6.   
  7. 根据关键字,过滤`ObservableCollection
  8.   
  9. 在关闭应用程序时,更新数据库[自从   ObservableCollection也可能是   由用户更新]
  10.   

我的问题:

  • 这是有效的方法吗?
  • 现在我的应用程序消耗大约30到50 MB的内存。那是公平的吗?
  • 或者我应该在数据库中执行搜索? [但我不能在速度上妥协]
  • 我是否应该始终创建myModel列表并将其加载到我的ObservableCollection中?
  • 还建议我使用非常适合增量搜索的过滤技术(第4点)。目前我有一个GenericList,后面包含整个查询集合,并将过滤后的项目添加到ObservableCollection中,清除所有以前的项目。

编辑:以前我只用37k记录检查了内存消耗。有250k记录,内存消耗超过100 MB :(。现在我计划在内存中只保留大约10k记录,如果它超出了我将查询数据库。任何建议? < / p>

提前致谢, 韦埃尔

1 个答案:

答案 0 :(得分:2)

在不中断用户工作流程或取得巨大性能影响的情况下,您可以做几件事。

  

现在我的应用消耗殆尽   30到50 MB的内存。那是公平的吗?

这对.net应用程序来说是正常的。启动应用程序后,您会立即注意到内存占用量不会太小。

  

或者我应该在中搜索   数据库改为? [但是我不能   在速度上妥协]

重复查询数据库仅适用于首先无法在一个步骤中加载数据的情况。每当用户键入框中时,您希望确保在每次更改搜索条件时都不查询数据库,而是在那里有一个短计时器,在使用新查询数据库之前等待一秒钟。标准。当重新查询数据库时,它还可以帮助减少在用户开始滚动时通过分页或延迟加载其余数据所显示的记录数。正确的数据库索引将帮助您显着降低此类查询的执行速度。

但是,如果您可以将整个列表保留在内存中(比如说它不是太大而无法一步从数据库中查询它,或者您需要向用户显示整个列表),那么最好保留一个列表的原始副本,并具有该列表的副本,您可以逐步过滤。因此,您需要检查搜索条件是否是先前搜索条件的子集。如果是这样,您可以过滤已经过滤的列表,否则您需要过滤原始列表。这可以使用LINQ .Where()运算符有效地实现,如果需要,可以使用PLINQ进行parralelized。 .Where()表现出O(n)时间AFAIK。

通过使用具有适当密钥的HashSet可以改进这一点。