简化if(x == 1 || x == 2)

Jim*_*son 15 c#

可能重复:
C#if语句匹配多个值

我经常发现自己编写代码,其中变量可以是A或B,例如当我在转发器上调用OnItemDataBound时:

protected void repeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {}
}
Run Code Online (Sandbox Code Playgroud)

然后我常常想,必须有一种更简单的方法.我想写一些类似的东西:

if(x == (1 || 2))
Run Code Online (Sandbox Code Playgroud)

SQL有IN(..)运算符,C#中有类似的东西吗?

WHERE x IN(1,2)
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用switch语句,但这并不简单.如果可能的话,我希望它在If语句中完成.

Mar*_*ell 15

我认为现在很好; 但是,你可以这样做:

// note the array is actually mutable... just... don't change the contents ;p
static readonly ListItemType[] specialTypes =
     new[]{ListItemType.Item, ListItemType.AlternatingItem};
Run Code Online (Sandbox Code Playgroud)

并检查:

if(specialTypes.Contains(e.Item.ItemType)) {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

但是要强调:我实际上只是在switch这里使用,因为switch整数和枚举通过跳转表进行特殊的IL处理,使其非常有效:

switch(e.Item.ItemType) {
    case ListItemType.Item:
    case ListItemType.AlternatingItem:
       // do stuff
       break;
}
Run Code Online (Sandbox Code Playgroud)


voi*_*oid 12

您可以编写这样的扩展方法:

public static bool In<T>(this T x, params T[] values)
{
  return values.Contains(x);
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

1.In(2,3,4)
Run Code Online (Sandbox Code Playgroud)

但我会说这不值得努力.

  • 有趣的apporach,你可以用`return values.Contains(x);`来写得更短 (7认同)

Ste*_*ner 7

如果你想模仿SQL IN语句,你可以做这样的事情...对于有2个项目的简单情况,这可能并不简单,但对于更多的项目,它肯定会.

(new[] { 1, 2 }).Contains(x);
Run Code Online (Sandbox Code Playgroud)