2017-11-19 2 views
0

私は観測可能なコレクションを持っています。マルチプル値でObservableCollectionをフィルタリングする方法

このコレクションのクラスには、サーバー値を持つことができるいくつかのフィールドがあります。

多くのフィールドや値を検索できるようにしたいと考えています。

私はICollectionを使用していますが、私が見たすべての例は1つのフィールドの検索に基づいています。

これが私のクラスである:

private bool TaskFilter(
    object item) 
{ 
    var task = item as KanbanModelExtra; 

    if (task == null) 
    { 
     return false; 
    } 

    foreach (var searchItem1 in JobPrioritiesToSearchOn) 
    { 
     if (task.JobPriority == searchItem1) 
     { 
      foreach (var searchItem2 in JobLabelsToSearchOn) 
      { 
       if (task.JobLabel == searchItem2) 
       { 
        foreach (var searchItem3 in JobTypesToSearchOn) 
        { 
         if (task.JobType == searchItem3) 
         { 
          if (SearchByCurrentUser) 
          { 
           if (task.UserRef == HeartBeat.CurrentUser.UserRef) 
           { 
            return true; 
           } 
          } 
          else 
          { 
           return true; 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
    return false; 
} 

が、これは「そうです:

public ObservableCollection<KanbanModelExtra> Tasks 
{ 
    get 
    { 
     if (_tasks == null) 
     { 
      TaskView = CollectionViewSource.GetDefaultView(_tasks); 
      TaskView.Filter = TaskFilter; 
     } 
     return _tasks; 
    } 
    set 
    { 
     _tasks = value; 
    } 
} 
public ICollectionView TaskView { get; private set; } 

、そのように私のフィルタを設定:だから

public class Tasks 
{ 
    private string JobPriority; 
    private string JobLabel; 
    private string JobType; 
    private string UserRef; 
} 

JobPriority can be 'High', 'Low' 
JobLabel can be 'Apple', 'Android', 'Microsoft' 
JobType can be 'Internal', 'Private', 'Public' 

、私のような私のコレクションをインスタンス化重く醜い。また、すべての変更によってコレクションが更新されます。すべての基準が選択された後、私はコレクションを新鮮にすることができます。

良い方法がありますか?

答えて

1

foreachの狂気は、この式で置き換えることができます。

return ((SearchByCurrentUser && task.UserRef == HeartBeat.CurrentUser.UserRef) || !SearchByCurrentUser) && 
     JobPrioritiesToSearchOn.Contains(task.JobPriority) && 
     JobLabelsToSearchOn.Contains(task.JobLabel) && 
     JobTypesToSearchOn.Contains(task.JobType)); 
+0

ええと、そう簡単!ご回答有難うございます。私はそれを入れて報告します。ありがとうございました –

+0

申し訳ありませんが、間違っていたので、私は答えを編集しました。 – eocron

+0

こんにちは、私は今私のPCから離れる必要があります:(私は両方の答えの間にスピードテストをしたいと思います。私は時間とanswer.repliesをいただきありがとうと私はこれを完了したとすぐに戻ってお約束します:) Thanks again again :) –

1

チェーンテストを一緒に。コレクションのいずれかに渡されたフィルタに一致する場合

Any()はtrueを返します。JobPrioritiesToSearchOn項目のいずれかがtask.JobPriorityに等しい場合平易な英語では、最初の行が真と評価されます。

+0

ありがとう、私はこれらの答えの両方を比較して返信します –

+0

@eocron私は、元のロジックは 'SearchByCurrentUser'に依存していることに注意してください - それは偽である可能性がありますが、' true'結果は依然として必要な出力です。 – jdphenix

+0

ありがとう、私もこれに気づいた。答えを編集しました。 – eocron

関連する問題