Просто вокруг полутонового цвета или к черному или к белому.
float gray = (r + g + b) / 3
if(gray > 0x7F) return 0xFF;
return 0x00;
Это сложный сценарий. Вы почти создаете свой собственный механизм запросов на основе LINQ. Решение JaredPar (куда оно делось?) Отлично подходит, если вы хотите логическое И между всеми вашими критериями, но это может быть не всегда так.
Когда я недавно спорил с этим в одном из моих проектов, я создал два списка:
List<Predicate<T>> andCriteria;
List<Predicate<T>> orCriteria;
(в данном случае T - это клиент , для вас)
Я бы заполнил списки предикатами, которые я хочу, чтобы они были истинными. Например,
decimal salRequirement = 50000.00;
andCriteria.Add(c => c.Salary > salRequirement);
orCriteria.Add(c => c.IsMarried);
Затем я проверил бы все критерии в списках в моем предложении Where. Например:
Expression<Func<Client, bool>> clientWhere =
c => andCriteria.All(pred => pred(c) ) && orCriteria.Any(pred => pred(c) );
Это также можно сделать с помощью цикла for для удобства чтения.
Взгляните на Predicate Builder , я думаю, это может сработать для вас.
Я считаю, что вы можете просто сделать следующее:
Expression<Func<Client, bool>> clientWhere = c => true;
if (filterByClientFName)
{
var prefix = clientWhere.Compile();
clientWhere = c => prefix(c) && c.ClientFName == searchForClientFName;
}
if (filterByClientLName)
{
var prefix = clientWhere.Compile();
clientWhere = c => prefix(c) && c.ClientLName == searchForClientLName;
}
Если вам нужно сохранить все в Expression
-land (для использования с IQueryable
) , вы также можете сделать следующее:
Expression<Func<Client, bool>> clientWhere = c => true;
if (filterByClientFName)
{
Expression<Func<Client, bool>> newPred =
c => c.ClientFName == searchForClientFName;
clientWhere = Expression.Lambda<Func<Freight, bool>>(
Expression.AndAlso(clientWhere, newPred), clientWhere.Parameters);
}
if (filterByClientLName)
{
Expression<Func<Client, bool>> newPred =
c => c.ClientLName == searchForClientLName;
clientWhere = Expression.Lambda<Func<Freight, bool>>(
Expression.AndAlso(clientWhere, newPred), clientWhere.Parameters);
}
Это можно сделать менее подробным, определив этот метод расширения:
public static Expression<TDelegate> AndAlso<TDelegate>(this Expression<TDelegate> left, Expression<TDelegate> right)
{
return Expression.Lambda<TDelegate>(Expression.AndAlso(left, right), left.Parameters);
}
Затем вы можете использовать такой синтаксис:
Expression<Func<Client, bool>> clientWhere = c => true;
if (filterByClientFName)
{
clientWhere = clientWhere.AndAlso(c => c.ClientFName == searchForClientFName);
}
if (filterByClientLName)
{
clientWhere = clientWhere.AndAlso(c => c.ClientLName == searchForClientLName);
}