편집 : 임의의 클래스 또는 하나의 fooClass에 대해 필터링을 수행 할 수 있어야합니까? 후자의 경우 필터링 가능한 모든 클래스가 간단한 인터페이스를 구현하고 필터링을 위해 액세스 할 수 있습니다. 예를 들어, 당신은 내가 외부 클래스에서 필터를 구현하고있어이 예에서이
public interface IFilterableByFlags<T>
{
Dictionary<string, Func<T, bool, bool>> GetFilters();
IEnumerable<T> ApplyFilters(IEnumerable<T> collection, Dictionary<string, bool> filterValues);
}
public class FooFilters : IFilterableByFlags<fooClass>
{
public Dictionary<string, Func<fooClasss, bool, bool>> GetFilters()
{
var filters = new Dictionary<string, Func<fooClass, bool, bool>>();
filters["AdminAccess"] = (obj, val) => obj.AdminAccess == val;
filters["ChildRestrictions"] = (obj, val) => obj.ChildRestrictions == val;
return filters;
}
public IEnumerable<fooClass> ApplyFilters(IEnumerable<fooClass> collection, Dictionary<string, bool> filterValues)
{
var filters = GetFilters();
// this could be written using Linq Aggregate, but I prefer an
// explicit loop. Simpler error handling (omitted here for brevity)
foreach(var f in filtervalues)
{
collection = collection.Where(foo => filters[f.Key](foo, f.Value));
}
return collection;
}
}
뭔가를 할 수 있지만, 하나는 쉽게 맞게이 코드를 혼합하고 일치하는 필터를 통합 할 fooClass을 확장 할 수 귀하 이 코드는 비 - 불린 (non-boolean) 필터를 지원하도록 쉽게 확장 될 수 있습니다.
조언 : 'AND'연산자와 'OR'연산자를 결합 할 때주의하십시오. 어떤 종류의 브래킷 시스템을 만들어야합니다. "r AND s OR t AND u v"와 같은 조건이있을 때 어떤 조건이 'AND'또는 'OR'을 통해 함께 연결되어야하는지 명확하지 않습니다. 'order' 필드는이 문제를 해결할 수 없습니다. – Progman
@Progman하지만 각 조건을 평가하면 문제가되지 않을 것이라고 다음 조건으로 평가했습니다. true || false = true 그런 다음 세 번째 조건이있는 처음 두 조건에서 얻은 값 true && false = false –
C#'Expression's을 사용하여 이와 같은 동적 조건을 만들 수 있습니다. 보너스로 Entity Framework와 같은 것을 사용하고 있다면 데이터베이스 쿼리에도 이러한 조건이 적용됩니다. 그 질문이 보류되지 않았다면 나는 그 예를 제시 할 수 있었다. – Evk