Как обнаружить дубликаты в результатах лямбда-функций? - PullRequest
0 голосов
/ 20 января 2020

Мы работаем с механизмом правил, основанным на лямбда-функциях. Каждая функция создается с типом:

Func<Term, bool>

Каждая функция потребляет объект типа Term и возвращает логическое значение. Термин представляет собой набор функций, таких как:

public class Term
{
    public string Name { get; set; }
    public int Age { get; set; }
    public double Price { get; set; }
    public int SomeCount { get; set; }
}

Функции определяют некоторые условия этих Условий. Например:

Func<Term, bool> function = t => t.Age >= 18 && t.Name == "Tom";
Func<Term, bool> function = t => t.Price >= 26 || t.Price < 3200;
...

Учитывая набор этих функций, есть ли способ обнаружить, если несколько функций возвращают true для какого-либо указанного c члена? Другими словами, есть ли способ проверить, не являются ли такие функции неинъективными? Грубое принуждение каждого возможного термина, конечно, не вариант.

Я не могу работать с данным термином. У меня есть набор этих функций, и я хочу знать, МОЖЕТ ЛИ БЫТЬ термин, для которого более чем одна функция возвращает true.

РЕДАКТИРОВАТЬ: я понимаю, что мне придется анализировать некоторые операторы и делать много жестко закодированные выражения для унификации операторов для каждой переменной, но возможно ли это? У меня проблемы, особенно с || -оператором.

Должен быть способ проверить, есть ли две функции, которые обе возвращают true для какого-либо определенного c члена.

1 Ответ

1 голос
/ 20 января 2020

Сохраните ваши функции в списке или в массиве. Затем вы можете проверить через LINQ, если несколько функций возвращает true:

Func<Term, bool>[] functions = new Func<Term, bool>[]
 {
 t => t.Age >= 18 && t.Name == "Tom",
 t => t.Price >= 26 || t.Price < 3200
 };
Term yourTerm = new Term();
int amountFunctionsReturningTrue = functions.Count(f => f(yourTerm));
if(amountFunctionsReturningTrue > 1)
 {
 Console.WriteLine("More than one function returned true");
 }
...