2009-09-22 13 views
6

エンドユーザーがフィルタリング(検索)する必要があるObservableCollectionが約1000個あります。ユーザーは名前または従業員IDで検索できる必要があります。 List ControlはFilteredEmployeesを消費し、Employeesはページのロード時にすべてロードされます。ユーザー入力によるObservableCollectionのフィルタリング

私は現在、それは以下のような設定があります。

public ObservableCollection<EmployeeServicesData> Employees { get; set; } 
public ObservableCollection<EmployeeServicesData> FilteredEmployees { get; set; } 

internal void FilterEmployee(string searchText, bool isByName) 
{ 
    if (searchText.Length > 0) 
    { 
     IEnumerabe<EmployeeServicesData> filter; 

     if (isByName) 
      filter = Employees.Where(x => x.Name.Length >= searchText.Length).Where(x => x.Name.Substring(0, searchText.Length) == searchText.ToUpper()); 
     else 
      filter = Employees.Where(x => x.EmployeeNumber.ToString().Length > searchText.Length).Where(x => x.EmployeeNumber.ToString().Substring(0, searchText.Length) == text); 

     foreach (EmployeeServicesData employee in filter) 
      FilteredEmployees.Add(employee); 
    } 
} 

衛生このメソッドの前に処理されます。

これは非常に効率的なにおいをしません。このために2つの方法を使用するか、フィルタリングを処理するためのよりよい方法がありますか?

従業員を変更しない状態にしておきたいので、FilteredEmployeesを完全なリストに再追加することはできません。

+0

どのような種類のあなたのリストコントロールがありますか?それは、フィルタされた従業員をコピーするのではなく、直接それを消費することができればうまくいくだろうが、おそらく1000であってもそれはまったく問題ではない。 –

+0

FilteredEmployees上の通常の古いListBoxバインド – Slipfish

答えて

1

searchTextが従業員名または従業員番号に含まれているかどうかを確認しようとしているようです。

x.Name.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0 
x.EmployeeNumber.ToString().IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0 

をそれとも、STARTSWITH代わりのIndexOfメソッドを使用することもできます。

あなたは代わりにこれを行うことができます。

編集:大量のデータを含むリストコントロールのもう1つの問題は、レンダリングに時間がかかることです。ですから、SilverlightやWCFを起動したときにフィルタリングされていない場合や、すべてが表示されていなくても1000をすべてコントロールにレンダリングしなければならない場合は、少し時間がかかります。 Silverlight 3にはUI Virtualizationが含まれていますが、これはおそらく最適な最適化です。

+0

現在、ページングされたゲートウェイによって満たされているので、問題はありません。 – Slipfish

2

これは古い投稿だと知っていますが、フィルタリングの面で私を助けてくれて、SlipFishがIEnumerableコレクションの周りをループしてObservableCollectionを作成していることに気付きました。

FilteredEmployees = new ObservableCollection<EmployeeServicesData>(filter); 
+0

非常に便利です+1 – electricalbah

1

filtered observable収集のために、この記事を見てみましょう:のObservableCollectionコンストラクタとして

はのObservableCollectionは次のように作成することができたのIEnumerableコレクションを受け入れます。

+0

このコードは、私が探していたものです。これを指摘してくれてありがとう! –

関連する問題