Как эффективно свести список логических выражений с операторами AND / OR к одному результату - PullRequest
0 голосов
/ 08 июля 2019

Я ищу эффективный способ сократить список утверждений True / False, которые содержат условия И / ИЛИ с помощью C #.

Мысль о циклическом просмотре каждого из них и простой оценке каждого элемента до следующего координирующего элементав списке с помощью простого уравнения (такого как пример:

if (item[1].operator == "AND") // Evaluate NEXT item's operator (AND/OR)
{  
   result == item[0] && item[1]  // Which would resolve out to T 
}
else if (item[1].operator == "OR")
{

}

* Но я должен включить логику, которая также будет включать операции И / ИЛИ при сравнении списка элементов ...

Пример данных, которые мне нужно будет привести к единственному результирующему результату T / F. У меня есть список логических значений и операторов (И / ИЛИ), и мне нужно найти способ

public class TestProcessor() {
    bool Result { get; set; }
    string Operator { get; set; }  // Specifies if it is tied together in the statement with an AND or an OR 
...
}


public class TestLogic() {
    List<TestProcessor> TestProcesses { get; set; }

    public bool ReduceAll() {
     ...  This would essentially take all items in the 'TestProcessor' property and resolve out the list of items accordingly in the order they are in from the list and in conjunction to if they are linked together with an AND or an OR
    }
}


If I had a list of Processes that Result in 
* Note:  (First item and last item don't need AND/OR operators)
[0]  Result = True,  Operator = null    
[1]  Result = True,  Operator = OR   
[2]  Result = True,  Operator = OR   
[3]  Result = True,  Operator = AND   
[4]  Result = False,  Operator = OR
[5]  Result = True,  Operator = AND      

(T) OR (T) OR (T) AND (T) OR (F) AND (T)  which would resolve out to: True 

Is there an easy way or a more dynamic way to do this?  Or is there a way to more easily just pass the data to the compiler to evaluate out the entire list of items for it to evaluate without all the extra effort?

1 Ответ

1 голос
/ 08 июля 2019

Простая итерация, которую вы сказали, что у вас уже есть, вероятно, будет лучшим вариантом ... Но если вам действительно нравится какой-то LINQ - Enumerable.Aggregate - это метод, который вы ищете.Примерно как:

var result = list.Aggregate(true, (sum, cur) => 
      cur.Operator == "AND" ? sum && cur.Result : sum || cur.Result);
...