3

我想知道这是否可能:

我想要一个列表,我可以在其中添加布尔方法并验证这些方法,当它们都为真时,返回真。当至少一个为假时,返回假。

问题是,当我做类似的事情时:

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());

添加的布尔值当然是添加到列表时验证的结果。我明白了 ;-)

如何使用实际重新验证的方法制作列表?亲切的问候,

马蒂斯

这就是我想要的。

在以下答案的帮助下。我做的。可能对寻找相同事物的其他人有用。

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;
        }

    }
}
4

2 回答 2

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 作为另一个答案

于 2013-03-20T10:12:15.660 回答
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());
于 2013-03-20T10:16:47.237 回答