Wpf 什么';这是搜索和过滤可观察集合的有效方法

Wpf 什么';这是搜索和过滤可观察集合的有效方法,wpf,search,mvvm,filter,observablecollection,Wpf,Search,Mvvm,Filter,Observablecollection,我有一个数据库,由大约一百万条记录组成。我的应用程序对这些记录进行频繁的增量搜索,并过滤UI列表。该场景更像是“电话联系人搜索”。 目前我正在关注以下内容: 将数据加载到数据源层的列表中` 将其发送到MainViewModel 将列表加载到可观察集合 (绑定到ListView) 根据关键字过滤“ObservableCollection” 关闭应用程序时,更新数据库[自 可观察到的收集也可能是 [由用户更新] 我的问题是: 这是有效的方法吗? 现在我的应用程序消耗了大约30到50MB的内存。这

我有一个数据库,由大约一百万条记录组成。我的应用程序对这些记录进行频繁的增量搜索,并过滤UI列表。该场景更像是“电话联系人搜索”。
目前我正在关注以下内容:

  • 将数据加载到数据源层的
    列表中
    `
  • 将其发送到MainViewModel
  • 列表
    加载到
    可观察集合
    (绑定到ListView)
  • 根据关键字过滤“ObservableCollection”
  • 关闭应用程序时,更新数据库[自 可观察到的收集也可能是 [由用户更新]

  • 我的问题是:

    • 这是有效的方法吗?
    • 现在我的应用程序消耗了大约30到50MB的内存。这公平吗?
    • 还是应该改为在数据库中执行搜索?[但我不能在速度上妥协]
    • 我是否应该始终创建myModel的列表并将其加载到ObservableCollection中?
    • 另外,请就非常适合增量搜索的过滤技术向我提供建议(第4点)。目前,我有一个GenericList,其中包含整个集合以供查找,并将筛选的项添加到ObservaleCollection,清除所有以前的项
    Edit:之前我只检查了37k条记录的内存消耗。有250k条记录,内存消耗超过100MB:(。因此,现在我计划在内存中只保留大约10k条记录,如果超过了这一点,我将查询数据库。有什么建议吗?

    提前感谢,,
    Veer

    您可以在不中断用户工作流程或造成巨大性能损失的情况下执行一些操作

    现在我的药水消耗了四周 30到50MB的内存,这样公平吗

    这对于.net应用程序来说是正常的。您会注意到,在启动应用程序后,直接占用的内存不会小很多

    或者我应该在 而是数据库?[但我不能 速度上的妥协]

    只有在无法一步加载数据的情况下,才适合重复查询数据库。每当用户在框中键入内容时,您都希望确保不会在搜索条件的每次更改中查询数据库,而是在其中设置一个短计时器,在查询数据库之前等待一秒钟左右在重新查询数据库时,当用户开始滚动时,它还可能有助于减少通过分页或延迟加载其余数据显示的记录数。正确的数据库索引将帮助您显著降低此类查询的执行速度

    但是,如果您可以将整个列表保存在内存中(假设它不是太大,无法一步从数据库中查询,或者您需要向用户显示整个列表),最好保留列表的原始副本,并具有可增量筛选的列表副本。因此,您需要检查您的搜索条件是否是以前搜索条件的子集。如果是,您可以筛选已筛选的列表,否则您需要筛选原始列表。这可以使用LINQ
    .Where()
    运算符,如有必要,可使用PLINQ进行并行化。
    .Where()
    显示O(n)时间AFAIK


    这可以通过使用具有适当键的哈希集来改进。

    但是db索引没有任何帮助,因为我的搜索模式是“%keyword%”类型除了在前进方向上查询以前的搜索外,我还尝试在按下backspace时使用列表。但是我恐怕这是一个不好的做法。你可以在下面的部分向我解释更多吗HashSet部分?HashSet是另一种将对象集合保存在内存中的方法。HashSet背后的思想是,它使用对象的哈希(通过
    对象检索。GetHasCode
    )建立字典,哈希作为键,对象作为值。所有典型操作(插入、检索、删除)因此通常可以在O(log(n))中发生。最坏的情况是O(n),但最不可能发生(所有对象都需要散列到相同的值)。您可以在wikipedia上阅读关于散列集的内容。