2013-03-20 2 views
3

мне интересно, если это возможно:Validate методы BOOL (ограничения) в списке

Я хотел бы иметь список, где я могу добавить методы BOOL к и проверки этих методов, и когда все они правдивы, возвращение правда. Если хотя бы одно значение false, верните значение false.

Проблема заключается в том, когда я делаю что-то вроде:

private int _value1, _value2, _value3, _value4; 

private bool check2() 
{ 
    return _value2 + _value3 > _value4; 
} 

private bool check2() 
{ 
    return _value2 + _value3 > _value4; 
} 

List<bool> constraints = new List<bool>(); 
constrains.Add(check1()); 
constrains.Add(check2()); 

в Bools добавил, конечно, результат проверки при добавлении в список. Я получаю это ;-)

Как я могу составить список методов, которые действительно повторно проверены? С наилучшими пожеланиями,

Matthijs

Это то, что я хотел.

С помощью нижеприведенных ответов. Я сделал это. Может быть полезно для тех, кто ищет то же самое.

public class TestClass 
{ 
    private int _value1, _value2, _value3, _value4; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     ConstraintsList cl = new ConstraintsList(); 
     cl.Add(check1); 
     cl.Add(check2); 

     bool test1 = cl.AllTrue; 
     bool test2 = cl.AnyTrue; 

     _value4 = -5; 

     bool test3 = cl.AllTrue; 
     bool test4 = cl.AnyTrue; 

     _value4 = 5; 

     cl.Remove(check2); 

     bool test5 = cl.AllTrue; 
     bool test6 = cl.AnyTrue; 
    } 

    private bool check1() 
    { 
     return _value1 + _value2 == _value3; 
    } 

    private bool check2() 
    { 
     return _value2 + _value3 > _value4; 
    } 

} 

с помощью:

public class ConstraintsList 
{ 
    private HashSet<Func<bool>> constraints = new HashSet<Func<bool>>(); 

    public void Add(Func<bool> item) 
    { 
     try 
     { 
      constraints.Add(item); 
     } 
     catch(Exception) 
     { 

      throw; 
     } 
    } 

    public bool AllTrue { get { return constraints.All(c => c()); } } 
    public bool AnyTrue { get { return constraints.Any(c => c()); } } 

    public void Remove(Func<bool> item) 
    { 
     try 
     { 
      constraints.Remove(item); 
     } 
     catch(Exception) 
     { 
      throw; 
     } 

    } 
} 

ответ

6

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

List<Func<bool>> constraints = new List<Func<bool>>(); 

// add your functions 
constraints.Add(check1); 
constraints.Add(check2); 

// and then determine if all of them return true 
bool allTrue = constraints.All (c => c()); 

// or maybe if any are true 
bool anyTrue = constraints.Any(c => c()); 
+0

Спасибо Филу за быстрый ответ. Он работает отлично! – user369122

7

Да, это возможно, вы можете определить список Func<bool>

List<Func<bool>> constraints = new List<Func<bool>> 

Таким образом, вы можете добавить свои bool методы в этот список:

constraints.Add(check1); 
constraints.Add(check2); 

Таким образом, вы можете использовать этот список, как показано ниже:

foreach (var method in constraints) 
{ 
    bool flag = method(); 
    ... // Do something more 
} 

Или использовать LINQ как еще один ответ, если вам нужно

+0

спасибо за быстрый ответ. Перед тем как ответить на последнее изменение, я внедрил решение, данное Филом, с параметрами allTrue и anyTrue. Вот почему я принимаю его ответ. Но спасибо вам большое. – user369122

Смежные вопросы