我有条件需要检查
if(staffid!=23||staffid!=24||staffid!=25||staffid!=26||staffid!=27||staffid!=29||staffid!=31)
{
do the req thing ..
}
现在我检查这样的情况。 是他们写这种情况的更好方法
谢谢
答案 0 :(得分:25)
将几个其他答案(mjv,pasta,Mike Hofer,R。Bemrose)合并在一起,您将得到以下代码。
至于代码:
if(!isStaffIDValid(staffid))
{
//do the req thing ..
}
...
然后在同一个类中,或者更优选地,全局类使用此代码:
public static IList<int> notAllowedIDs = new int[] { 23, 24, 25, 26, 27, 29, 31 };
public static bool isStaffIDValid(int staffID)
{
return !notAllowedIDs.Contains(staffID);
}
这提供了可维护的代码,可以轻松更新。
答案 1 :(得分:19)
Errr ..不等同于:
if (true) { do the req thing... }
除非staffid
可以同时为23和24以及25和26以及27和29以及31。
想象一下2例:
staffid = 23
staffid != 23
您的陈述:
if(staffid!=23 ||
staffid!=24 ||
staffid!=25 ||
staffid!=26 ||
staffid!=27 ||
staffid!=29 ||
staffid!=31)
{
do the req thing ..
}
案例1通过第二次测试(staffid != 24
),案例2通过第一次测试(staffid!=23
)。由于案例1和案例2共同考虑了所有案例,因此staffid
的所有值都应通过您的测试。
答案 2 :(得分:7)
无法想象你的实际问题是什么,这句话看起来不对。
如果在复杂条件下有很多“不”,只需将其转换为相反的情况。如果同时存在if和else部分,则交换它们。如果没有别的,就把“不”放到开头。你的情况看起来不对,只是为了表明我的意思,这里是转换的:
if (staffid == 23
&& staffid == 24
&& staffid == 25
&& staffid == 26
&& staffid == 27
&& staffid == 29
&& staffid == 31)
{
//if there was an else block before, it will be here now.
}
else
{
//do the req thing ..
}
然后你可以更容易地理解这种情况,更容易看出它不是你需要的......
答案 3 :(得分:3)
使用函数allowStaff(staffid,“Payment”)。然后在一个中心函数allowStaff中完成所有检查。这样即使你有一个聪明的想法,你可以在一个地方更快地改变它!
答案 4 :(得分:3)
首先,staffid
的数据类型是什么?它是enum
吗? int
?
然后,变量的名称向我发送一个红旗。当这些行为/角色可能在未来发生变化时,您是否将特定个人或角色的行为硬编码到您的应用程序中?你可能想重新考虑一下。
现在,这样做,假设staffid
是int
:
int[] inValidIds = {23, 24, 25, 26, 27, 29, 31};
if (! ((IList<int>)inValidIds.Contains(staffId)))
{
// Do stuff;
}
请参阅here。
答案 5 :(得分:3)
假设你的意思是:
if (staffid != 23 && staffid != 24 && staffid != 25 && staffid != 26 && staffid != 27 && staffid != 29 && staffid != 31)
{
// Do Stuff
}
看到一个不错的扩展方法来执行此操作:
public static bool In<T>(this T source, params T[] list)
{
if(null==source) throw new ArgumentNullException("source");
return list.Contains(source);
}
所以你的代码是:
if(!staffid.In(23, 24, 25, 26, 27, 29, 31))
{
do the req thing ..
}
从此answer
答案 6 :(得分:2)
我认为克里斯在这里是正确的,但为什么要转换成一个列表呢?
public static int[] notAllowedIDs = new int[] { 23, 24, 25, 26, 27, 29, 31 };
// Other code here
if (Array.IndexOf(notAllowedIDs, staffId) < 0)
{
// do the req thing ..
}
附加说明:Array.IndexOf
和List.Contains
都是O( n )操作,其中n是元素的数量。但是,Array.IndexOf
会保存从数组到列表的转换。
Array.IndexOf
返回数组的下限 - 当找不到元素时为1,对于大多数数组为-1。
答案 7 :(得分:1)
如何
if(staffid < 23 || staffid == 30 || staffid > 31)
{
do the req thing ..
}
答案 8 :(得分:0)
switch(var)
{
case foo:
case bar:
doIt();
break;
}
答案 9 :(得分:0)
将您的员工ID列表放在List中,并使用LINQ查询整数列表(如果staffid不在列表中)。