web-dev-qa-db-ja.com

大量のデータセットを含むWPFのICollectionView.filter

非常に多くのデータ(10000から100000)行を含むリストビューを含むwpfアプリに取り組んでいます。ユーザーは、このリストビューにあらゆる種類のフィルターを適用して、フィルターロジックを非常に高度(かつ低速)にすることができます。今のところ、私のコードの関連部分は次のようになっています。

ICollectionView view = CollectionViewSource.GetDefaultView(hugeList.ItemsSource);
view.Filter = new Predicate<object>(FilterCallback);

private bool FilterCallback(object item)
{
  //Filter logic
}

ただし、これはUIスレッドで実行され、フィルタリング時にアプリケーション全体をブロックするため、ユーザーエクスペリエンスが非常に低下します。ですから、皆さんへの私の質問は、wpfでリストビューをフィルタリングするための「より良い」方法を知っている人はいますか?それとも、代わりに基になるObservableCollectionをフィルタリングする必要がありますか?

24
J W

フィルタ機能に細心の注意を払ってください。不要なボックス化/ボックス化解除を行っていないこと、およびその中で大規模な計算を行っていないことを確認してください。また、使用しているCollectionViewの種類にも注意を払う必要があります。一部は他よりも高速です。 From ソートに関するBeaの投稿

  • ソースがIEnumerableを実装している場合、CollectionViewが作成されます。ソースがIEnumerableonlyを実装している場合、コレクションを並べ替えたりグループ化したりすることはできません(フィルタリングのみが可能です)。また、ソースに多数のアイテムがある場合、または挿入や削除などの動的な操作を実行する場合、perfは最適ではありません。これがシナリオである場合は、ソースに強力なインターフェイスを実装させることを検討する必要があります。 ICollectionは、Countプロパティを提供するため、わずかに優れています。

  • ListCollectionViewは、ソースがIListを実装するときに作成されるビュータイプです。 IEnumerableおよびICollectionと比較して、IListはインデクサーを提供し、迅速なランダムアクセスを可能にするため、大きなリストまたは動的リストに対してはるかに優れたパフォーマンスを発揮します。さらに、IListを使用すると、並べ替え、グループ化、およびフィルタリングが可能です。ただし、理想的には、ソースコレクションは、プロパティやコレクションの変更通知などのいくつかの追加機能を提供するため、データバインディングの観点からすべてのコレクションの母であるObservableCollectionから派生します。

  • BindingListCollectionViewは、ソースコレクションがIBindingListを実装するときにAvalonによって作成されるビューのタイプです。これは、ADO.NETシナリオで扱うビューです。並べ替えとグループ化はサポートしていますが、従来のフィルタリングはサポートしていません。代わりに、フィルタリングをDataViewに委任する追加のCustomFilterプロパティがあります(詳細については、ADO.NETの私の投稿を参照してください)。

@mihiが言ったように、フィルタリングを別のスレッドにキックすることができますが、私はCollectionViewsを使用して、目立ったラグなしに、最大60の変数(データベーステーブルの列)を持つオブジェクトの50,000アイテムのObservableCollectionで複数のフィルターを同時に実行しました。

フィルタ関数ですぐに気付くのは、入力がObject型であるということです。これは、関数内で型変換を行っているため、必要がない場合があることを意味します。また、戻り値の型を含まないPredicateを使用するため、CollectionViewのフィルタリングメソッド内で型変換またはリフレクションが必要になり、速度が低下する可能性があります。

21
Bryan Anderson

別のスレッドでフィルタリングしたり、ディスパッチャーを使用したりすることを検討しましたか?

WPFスレッド:ディスパッチャーを使用してより応答性の高いアプリを構築する は、利用可能ないくつかのスレッドオプションの概要を示しています。

3
user103712