Jako alternatywne rozwiązanie można wykorzystać następujące podejście, które pozwala określić zarówno pole filtra lub funkcję filtra:
var adresses = new List<Address>{
new Address() { City = "ABC", Country = "USA" },
new Address() { City = "BC", Country = "USA" },
new Address() { City = "C", Country = "UK" }
};
var filterValues = new List<string> { "B", "UK", "U" };
//
var FilterContains = [email protected]((values, value) => values.Contains(value));
var FilterStartsWith = [email protected]((values, value) => values.Any(v => value.StartsWith(v)));
//
var AdressesByCity = [email protected](a => a.City);
var adressesByCitiesContains = AdressesByCity(filterValues, FilterContains); // B->{ABC;USA},{BC;USA}
var adressesByCitiesStartsWith = AdressesByCity(filterValues, FilterStartsWith);// B->{BC;USA}
//
var AdressesByCountry = [email protected](a => a.Country);
var adressesByCountriesContains = AdressesByCountry(filterValues, FilterContains);//U,UK-> {C;UK}
var adressesByCountriesStartsWith = AdressesByCountry(filterValues, FilterStartsWith); //U,UK->{ABC;USA},{BC;USA}{C;UK}
Tutaj metod przedłużających @Specify
są realizowane w następujący sposób:
public static class @SpecifyExtension {
public static Func<IEnumerable<V>, Func<IEnumerable<V>, V, bool>, IEnumerable<U>> @Specify<U, V>(this IEnumerable<U> source, Func<U, V> selector) {
return (values, predicate) => source.Where(x => predicate(values, selector(x)));
}
public static Func<IEnumerable<TValue>, TValue, bool> @Specify<TValue>(this IEnumerable<TValue> source, Func<IEnumerable<TValue>, TValue, bool> func) {
return func; // for Type-inference only
}
}
Myślę, że powinieneś zdefiniuj typ zmiennej. –
To zależy od typu danych 'myFilters'. Przedłuż swoje pytanie za pomocą tych informacji. –
@VadimMartynov Nie rozumiem ... dlaczego musisz znać dane mojego filtra Myfilters Typ danych – Viru