Я новичок в динамических c данных и в целом в мире реактивных расширений, и в настоящее время я сталкиваюсь со следующей проблемой, где я хотел бы изменить предикаты IObservable<Func<T,bool>>
во время выполнения с помощью динамического c пакет данных и, следовательно, реактивные расширения в. NET (C#).
Учитывая следующую ситуацию, у меня есть DataGrid с некоторыми столбцами типа integer , допустим, A, B, C. Кроме того, имеется пользовательский интерфейс фильтра, в который пользователь может добавить несколько фильтров, например A == 6 , или комбинацию выражений фильтров, например A == 7 || A == 3 || B == 5 , et c. Таким образом, мой метод, возвращающий делегат Func<T, bool>
, выглядит следующим образом:
private Func<T, bool> FilterOnA(string id)
{
return n => n.Id == int.Parse(id);
}
И вызов метода Filter в конвейере данных:
// sourceList is used to fill the ReadOnlyObservableCollection<T> while receiving data from an event pattern
sourceList.Connect() // SourceList<T>
.Filter(filterViewModel.FilterOnA)
.Bind(out _itemsBinding) // private ReadOnlyObservableCollection<T>
.DisposeMany()
.Subscribe();
Как я упоминал выше, пользователь должен быть в состоянии добавить / удалить / изменить и еще более важно объединить выражения фильтра все вместе.
Поскольку метод фильтра данных Dynami c принимает Func<T,bool>
или IObservable<Func<T,bool>>
, одно из возможных решений может выглядеть следующим образом:
public IObservable<Func<T,bool>> Filter1 {get;}
public IObservable<Func<T,bool>> Filter2 {get;}
public IObservable<Func<T,bool>> Filter3 {get;}
public IObservable<Func<T,bool>> FilterX {get;}
public IObservable<Func<T,bool>> AllFiltersCombined => Filter1.CombineLatest(Filter2,Filter3,FilterX, (f1,f2,f3,fx) => AggregatePredicatesAnd(f1,f2,f3,fx));
public static Func<T,Bool> AggregatePredicatesAnd(params Func<T,bool>[] predicates)
{
return predicates.Aggregate<Func<T,bool>>((fa,fb) => (T t) => fa(t) && fb(t));
}
Теперь моя проблема есть, как написать это более обобщенным c способом? Как комбинировать например 0 to n
Фильтры? А что касается различных типов фильтров, например, комбинация A <= 7 && A! = 5 </strong>?