把一个if分解成多个if
比如你的例子,完全可以换一种写法:
if(!条件1 && !条件2)
{
return false;
}
if(!条件3)
{
return false;
}
return true;
比如你的例子,完全可以换一种写法:
if(!条件1 && !条件2)
{
return false;
}
if(!条件3)
{
return false;
}
return true;
解决方案 »
- 发了两次贴都没解决
- 经验帝入。外键该用"用户ID"还是"用户名"?
- 文件夹存贮文件的极限数以及检索时间问题
- vs.net 2008 clickonce 部署出错???
- 120分的贴子,大家帮手看一下.
- 给exe程序传参数,可以给main()传递非字符串参数吗,比如数组
- 大家帮忙了呀 我的vs2003 不知道怎么了呀 asp 不能 用 说是不是1.1的版本
- C#串口数据读取问题求助
- C# Winform 关于ListView的问题
- 为什么提示我这个错了radioButton1.Checked = false && radioButton2.Checked = false
- C# 合并word文档,其中一个word有图片但合并后只有一个有红色叉的白框
- dev textEdit的EditMask 属性设置为[\u4e00-\u9fa5]+,输入汉字是出现翻倍情况
if(条件1){return true;}
if(条件2){return true;}
if(!条件3){return false;}
return false;//如果上面的条件都没有走,默认false
我只启用条件01,禁用条件02和条件03,那么你这句:if(!条件1 && !条件2),就不行了啊。
还是我没看明白你的意思?
个人见解,有问题再讨论~~
我只启用条件01,禁用条件02和条件03,那么你这句:if(!条件1 && !条件2),就不行了啊。
还是我没看明白你的意思?
那是因为你没告诉我,条件1禁用的逻辑是怎样的,所以也没法优化
既然要判断条件1+条件2,那么当其中一个禁用了的时候,到底返回true还是false?
其实禁用不禁用,也不过是个bool值罢了,无非就是多加一层if判断
你可以传入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;}
}
/*
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;
}
}
例如如下设置
条件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
...
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,这也是错误的。所以问题的关键,在于如何把禁用的条件彻底消除,如何不让禁用的条件参与逻辑运算。这个,我现在还是看不懂你们给出的方法能够解决这个“不让禁用的条件参与逻辑运算”问题。
而是你必须让是否禁用这个条件也参与逻辑运算
举个例子
if(条件1 && 条件2)
那么当条件1被禁用,条件2为true的时候,到底返回什么,条件2为false的时候,到底又返回什么
如果你不能给出这个逻辑的真值,那么空谈"让它不参与运算"就是无意义的
{
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 关键类对象;
}
}
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。
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))
{
}
b=0x10;
c=0x100;如果d=0x111等于什么等于??? 如果判定d里有c操作??if(d & c==c) {则d里面有c滴操作}
0x1010 &0x10=10
你这个组合只有5种,怎么会有8种呢?那个是&&,不是或条件啊!