把一个if分解成多个if
比如你的例子,完全可以换一种写法:
if(!条件1 && !条件2)
{
return false;
}
if(!条件3)
{
return false;
}
return true;

解决方案 »

  1.   

    再分解:
    if(条件1){return true;}
    if(条件2){return true;}
    if(!条件3){return false;}
    return false;//如果上面的条件都没有走,默认false
      

  2.   

    对于这种做法,你可以去找下Express构造SQL的方法,那里有你想要的结果,那个判断条件比你还要复杂的多
      

  3.   


    我只启用条件01,禁用条件02和条件03,那么你这句:if(!条件1 && !条件2),就不行了啊。
    还是我没看明白你的意思?
      

  4.   

    LZ你看看假如将所有的条件都以变量的方式带入,在外部进行判断,启用就返回判断结果,未启用默认返回true,这样子行不行
    个人见解,有问题再讨论~~
      

  5.   


    我只启用条件01,禁用条件02和条件03,那么你这句:if(!条件1 && !条件2),就不行了啊。
    还是我没看明白你的意思?
    那是因为你没告诉我,条件1禁用的逻辑是怎样的,所以也没法优化
    既然要判断条件1+条件2,那么当其中一个禁用了的时候,到底返回true还是false?
    其实禁用不禁用,也不过是个bool值罢了,无非就是多加一层if判断
      

  6.   

    其实对于判断来说,问题就在于组合
    你可以传入Func<bool>的组合List<Func<bool>>
    然后你实际判断就是
    List<Func<bool>> list;
    var vali=true;
    for(var i=0;i<list.Count;i++)
    {
         vali = vali&&list[i];
         if(!vali)
         {break;}
    }
      

  7.   


    /*
     A1 B1 C3 为用户禁用条件的选项Y启用 N禁用
    */if(A1=="Y")
    {
    if(a ==a)
    {
    return false; 
    }
    }
    if(B1=="Y")
    {
    if(b ==b)
    {
    return false; 
    }
    }
    if(C1=="Y")
    {
    if(c ==c)
    {
    return false; 
    }
    }
      

  8.   

    我感觉你这里是要使用位运算的方法,C#中位运算最大可达到2^64 UINT64类型,应该完全能满足你的需求了。
    例如如下设置
    条件1 1
    条件2 4
    条件3 8
    条件4 16
    条件5 32
    条件6 64
    条件7 128
    条件8 256
    条件9 512
    在代码中使用计算var 客户选择=条件1|条件5|条件9;
    if(客户选择&条件1){ }//这里客户选择&条件1==true
    if(客户选择&条件2){ }//这里客户选择&条件2==false
    if(客户选择&条件3){ }//这里客户选择&条件3==false
    .....
    if(客户选择&条件5){ }//这里客户选择&条件5==true
    ...
      

  9.   

    以我的例子,若用穷举法,有这8种情况:
    1,if(条件01)
    2,if(条件02)
    3,if(条件03)
    4,if(条件01 || 条件02)
    5,if(条件01 && 条件03)
    6,if(条件02 && 条件03)
    7,if((条件01 || 条件02) && 条件03)
    8,全部禁用,不需要判断,直接返回false
    若是条件被禁用,不论是返回true或者false都是不行的,
    比如返回true,那么在第5种情况,若条件01为false,条件03为true,本来正确的结果是false,但是若已经禁用的条件02隐含地返回了一个true,而且与条件02进行了或的运算,那么结果就变成了true,这就是错误的。再比如返回false,那么在第4种情况,若条件01为false,条件02为true,那么正确结果应该是true,但是若已经禁用的条件03隐含地返回了一个false,而且与(条件01||条件02)的结果true进行了与的运算,那么最终结果就变成了false,这也是错误的。所以问题的关键,在于如何把禁用的条件彻底消除,如何不让禁用的条件参与逻辑运算。这个,我现在还是看不懂你们给出的方法能够解决这个“不让禁用的条件参与逻辑运算”问题。
      

  10.   

    比如返回true,那么在第5种情况,若条件01为false,条件03为true,本来正确的结果是false,但是若已经禁用的条件02隐含地返回了一个true,而且与条件02进行了或的运算,那么结果就变成了true,这就是错误的。更正:比如返回true,那么在第5种情况,若条件01为false,条件03为true,本来正确的结果是false,但是若已经禁用的条件02隐含地返回了一个true,而且与条件01进行了或的运算,然后再和条件03进行与运算,那么最终的结果就变成了true,这就是错误的。
      

  11.   

    并不是不让禁用的条件参与逻辑运算
    而是你必须让是否禁用这个条件也参与逻辑运算
    举个例子
    if(条件1 && 条件2)
    那么当条件1被禁用,条件2为true的时候,到底返回什么,条件2为false的时候,到底又返回什么
    如果你不能给出这个逻辑的真值,那么空谈"让它不参与运算"就是无意义的
      

  12.   

    谢谢大家。经询问某好手。他给了我一个思路,现在我给出完整的代码,希望能够帮助到后来需要解决这个问题的人。另外,请大家看看这段代码,是否确实解决了问题,是否还有隐藏的BUG。namespace Enable_Disable
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                List<条件组合> _条件组合对象 = new List<条件组合>();
                tbool t1 = new tbool { Availble = false, Enable = true };
                tbool t2 = new tbool { Availble = false, Enable = true };
                tbool t3 = new tbool { Availble = true, Enable = false };            _条件组合对象.Add(new 条件组合 { 逻辑关系 = "", 关键类对象 = t1 });
                _条件组合对象.Add(new 条件组合 { 逻辑关系 = "Or", 关键类对象 = t2 });
                _条件组合对象.Add(new 条件组合 { 逻辑关系 = "And", 关键类对象 = t3 });            List<条件组合> _条件组合对象_复制品 = new List<条件组合>(_条件组合对象.ToArray());            for (int i = 0; i < _条件组合对象_复制品.Count; i++)
                {
                    if (_条件组合对象_复制品[i].关键类对象.Enable == false)
                    {
                        _条件组合对象.RemoveAt(i);
                    }
                }            bool 结果;            if (_条件组合对象.Count > 0)
                {
                    _条件组合对象[0].逻辑关系 = "";
                    结果 = tbool.Allow2(_条件组合对象).Availble;
                }
                if (_条件组合对象.Count == 0)
                {
                    结果 = false;
                }
            }
        }    public class tbool
        {
            /// <summary>
            /// 条件判断的返回结果
            /// </summary>
            public bool Availble { get; set; }        /// <summary>
            /// 是否启用
            /// </summary>
            public bool Enable { get; set; }        public static tbool Allow2(List<条件组合> blist)
            {
                var t = new tbool { Availble = true, Enable = true };
                foreach (var k in blist)
                {
                    switch (k.逻辑关系)
                    {
                        case "":
                            t = k.关键类对象;
                            break;
                        case "And":
                            t = t.And(k.关键类对象);
                            break;
                        case "Or":
                            t = t.Or(k.关键类对象);
                            break;
                    }
                }
                return t;
            }        public tbool And(tbool t2)
            {
                return new tbool { Enable = true, Availble = this.Availble && t2.Availble };
            }
            public tbool Or(tbool t2)
            {
                return new tbool { Enable = true, Availble = this.Availble || t2.Availble };
            }
        }    public class 条件组合
        {
            public string 逻辑关系;
            public tbool 关键类对象;
        }
    }
      

  13.   

    那样写其实就是自己实现了最原始的二元逻辑表达式,缺点是丧失了直接写代码的便利,使用的时候逻辑不好理解,不支持括号,不支持逻辑非。不如直接用系统的Expression操作,当然这个如果说缺点那就是需要理解下Expression是什么,然后需要自己做好表达式里面各种情况的处理。写了一段支持最基本功能的,放在https://code.csdn.net/snippets/561932,用法如下:static bool C1() { return false; }
    static bool C2() { return true; }
    static bool C3() { return false; }static void Main(string[] args)
    {
        var func = Policy
            .From(() => (C1() || C2()) && C3())
            .Exclude(() => C1())
            .Exclude(() => C3())
            .Build();
        var result = func();
    }这就是一个方法作为一个条件,根据表达式中的方法调用来过滤,把不需要的方法调用从表达式里去掉。
    如果要用这个代码,那么注意:0. 没有写任何错误判断,也没有测试复杂情况;1. 直接根据MethodInfo过滤,没有考虑方法所在的对象;2. 如果全部过滤,但是在最外层做非操作,那么会返回true。
      

  14.   

    用枚举的按位组合
    enum 条件
    {
             None = 0,
             A = 1
             B = 2,
             C = 4,      
    }bool 满足条件(值 x, 条件 y)  //可以考虑写成扩展方法
    {
            return (x&y) == y;
    }if(x == 0)
    {
           return;
    }
    if(满足条件(x, 条件.A))
    {
    }
    if(满足条件(x, 条件.B))
    {
    }
    if(满足条件(x, 条件.C))
    {
    }
      

  15.   

    a=0x1;
    b=0x10;
    c=0x100;如果d=0x111等于什么等于??? 如果判定d里有c操作??if(d & c==c) {则d里面有c滴操作}
      

  16.   

    请参考位操作
    0x1010 &0x10=10
      

  17.   


    你这个组合只有5种,怎么会有8种呢?那个是&&,不是或条件啊!