或条件如果条件

时间:2009-10-05 12:42:24

标签: c#

我有条件需要检查

if(staffid!=23||staffid!=24||staffid!=25||staffid!=26||staffid!=27||staffid!=29||staffid!=31)
{
  do the  req  thing ..
}

现在我检查这样的情况。 是他们写这种情况的更好方法

谢谢

10 个答案:

答案 0 :(得分:25)

将几个其他答案(mjv,pasta,Mike Hofer,R。Bemrose)合并在一起,您将得到以下代码。

  1. 使用函数测试员工ID是否有效,这样您只需要更改一个地方。
  2. int数组没有Contains方法,因此您需要将其转换为IList(除非使用System.Linq命名空间中3.0中提供的扩展方法)。
  3. 至于代码:

    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例:

  1. staffid = 23
  2. staffid != 23
  3. 您的陈述:

    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

然后,变量的名称向我发送一个红旗。当这些行为/角色可能在未来发生变化时,您是否将特定个人或角色的行为硬编码到您的应用程序中?你可能想重新考虑一下。

现在,这样做,假设staffidint

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.IndexOfList.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不在列表中)。