Как конвертировать linq селектор в предиктор - PullRequest
1 голос
/ 13 сентября 2010

У меня есть лямбда-селектор, скажем, Func<T, TResult>.Можно ли преобразовать его в предиктор (Func<T, bool>), используя объект TResult в качестве ссылки?

Например, преобразовать

x => x.Name

в

x => x.Name == customerName

Ответы [ 4 ]

4 голосов
/ 13 сентября 2010

Как то так?

static Func<TInput, bool> CreatePredicate<TInput, TResult>(Func<TInput, TResult> selector, TResult comparisonValue)
{
    return tInput => selector(tInput).Equals(comparisonValue);
}

Использование:

Func<Foo, bool> myPredicate = CreatePredicate(x => x.Name, customerName);

Не могли бы вы рассказать нам немного больше о том, почему вы хотите это сделать?

1 голос
/ 13 сентября 2010

Я предполагаю, что вы имели в виду

x => x.Name == customerName

, потому что = - это назначение, и я думаю, что вы хотите сравнение.

Ответ:

static Func<T, bool> MakePredictor<T>(Func<T, string> lambda,
                                      string customerName)
{
    return x => lambda(x) == customerName;
}
1 голос
/ 13 сентября 2010

Попробуйте это:

Func<Person, string> projection = x => x.Name;

Func<Person, bool> predicate = x => projection(x) == customerName;
0 голосов
/ 13 сентября 2010
static Predicate<T> Predicate<T, TResult>(Func<T, TResult> selector, TResult value) {
  return Predicate(selector, value, EqualityComparer<TResult>.Default);
}

static Predicate<T> Predicate<T, TResult>(Func<T, TResult> selector, TResult value, IEqualityComparer<TResult> comparer) {
  if(selector == null) {
    throw new ArgumentNullException("selector");
  } else if(comparer == null) {
    throw new ArgumentNullException("comparer");
  }

  return x => comparer.Equals(selector(x), value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...