简化 if(x == 1 || x == 2) 的写法。

15

可能是重复问题:
C# if statements matching multiple values

我经常写这样的代码,其中一个变量可以是A或B,例如在重复器上调用OnItemDataBound时:

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

我常常会想,一定有更简单的方法可以做到这个。我想写出类似这样的代码:

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

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

WHERE x IN(1,2)

我知道我可以使用 switch 语句,但那不够简单。如果可能的话,我希望它能够在 if 语句中完成。


1
最易读的方式:if。最快的方式:可能是switch。解决问题的语法:COBOL :D - Kendall Frey
如果 (e.Item.DataItem == null) 返回; 比起 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 在绑定重复器时更容易编写。 - Jimmy Mattsson
6个回答

15

我认为现在的状态很好;但是,你可以做一些像这样的事情:

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

并检查以下内容:

if(specialTypes.Contains(e.Item.ItemType)) {
    // do stuff
}

但需要强调的是:在这里,我实际上会使用 switch,因为针对整数和枚举类型的 switch 具有特殊的 IL 处理方式,通过跳表使其效率非常高:

switch(e.Item.ItemType) {
    case ListItemType.Item:
    case ListItemType.AlternatingItem:
       // do stuff
       break;
}

1
针对 switch 语句给个大拇指!在处理不仅 Item 或 AlternatingItem,如 Footer 或 Header 等更多情况下,我过去常常使用它。但有时为了代码更简洁,我也会使用它,而不是手写 if 语句。 - Anthony Shaw

12
你可以编写一个类似这样的扩展方法:
public static bool In<T>(this T x, params T[] values)
{
  return values.Contains(x);
}

并按照以下方式进行调用:

1.In(2,3,4)

但我认为这不值得花费精力。


7
有趣的方法,你可以用 return values.Contains(x); 写得更短。 - martinstoeckli

8

如果你想模拟SQL IN语句,你可以这样做...对于只有两个项目的简单情况,这可能不是更简单的方法,但对于更多的项目来说,这肯定是更好的选择。

(new[] { 1, 2 }).Contains(x);

1

您可以使用以下方法,该方法在此答案中找到

public static bool In<T>(this T source, params T[] list)
{
  if(null==source) throw new ArgumentNullException("source");
  return list.Contains(source);
}

调用方式如下:

if(x.In(1,2,4))
{
      // ...
}

0

除非单个if的可能选项不是太多,否则你的代码应该是可读性和清晰度最重要的。

如果你经常遇到有超过3个条件的if,你可以使用

new List<..>{ condition1, condition2, ... ConditionN}.Any<>()之类的东西。

就像这样。


0

我认为这已经是你所能得到的最简单的方法了。请注意,其他答案甚至是你自己的建议都使用特殊的结构和解决方法来缩短一些微不足道的语法。此外,这些聪明的解决方法会影响性能。

但是,对于占用大量空间的两到三个项目,我喜欢将条件放在后续行中,使阅读稍微容易一些。

if (x == MyEnum.SomeReallyLongNameThatEatsUpTheLine ||
    x == MyEnum.TheOtherNameThatWastesSpace)
{
// The simplest code.
}

我想如果你有一个非常长的可能值列表,那么数组方法会更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接