2017-11-19 1 views
0

Ich habe eine beobachtbare Sammlung.So filtern Sie ObservableCollection auf Multipie-Werten

Die Klasse dieser Sammlung hat mehrere Felder, die wiederum Serverwerte haben können.

Ich wünsche meinem Benutzer in der Lage sein, auf zahlreiche Felder und Werte zu suchen.

Ich habe so weit wie eine ICollection verwenden, aber alle Beispiele, die ich gesehen habe, basiert auf der Suche auf 1 Feld.

Das ist meine Klasse:

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' 

Also, instanziiert ich meine Sammlung als solche:

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; } 

und stellte meine Filter als solche:

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; 
} 

aber dies scheint ' schwer und hässlich. Außerdem wird jede Änderung die Sammlung aktualisieren. Wo ich nach allen Kriterien die Kollektion frisch anlügen würde.

Gibt es einen besseren Weg?

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

Antwort

1

foreach Wahnsinn kann durch diesen Ausdruck ersetzt werden. wenn eine der JobPrioritiesToSearchOn Artikel

Any() gibt true zurück, wenn eine der Sammlung der übergebenen Filter entsprechen. Im Klartext, die erste Zeile den Wert true zu task.JobPriority gleich sind.

+0

hmm, scheint so einfach! Danke für deine Antwort. Ich werde es einreichen und Bericht erstatten. Danke –

+0

Sorry, ich habe die Antwort bearbeitet, weil sie falsch war. – eocron

+0

Hallo, ich muss jetzt von meinem PC weg sein :(Ich möchte Geschwindigkeitstests zwischen beiden Antworten machen. Ich schätze Ihre Zeit und antworte. Antworten und versprechen, sobald ich das abgeschlossen habe. Danke nochmal :) –

1

Kette zusammen:

+0

Danke, ich werde einen Vergleich zwischen diesen beiden Antworten machen und antworten –

+0

@eocron Ich bemerke, dass die ursprüngliche Logik von 'SearchByCurrentUser' abhängt - es kann falsch sein und dennoch ist ein 'wahres' Ergebnis immer noch die erforderliche Ausgabe. – jdphenix

+0

Danke, das habe ich auch bemerkt. Bearbeitete die Antwort. – eocron

Verwandte Themen