【问题标题】:Combining multiple conditional expressions in C#在 C# 中组合多个条件表达式
【发布时间】:2011-09-17 10:08:32
【问题描述】:

在 C# 中,不使用 if(index == 7 || index == 8),有没有办法将它们组合起来?我在想if(index == (7, 8))之类的东西。

【问题讨论】:

标签: c# conditional-statements


【解决方案1】:

据我所知,在当前的 C# 语法集中,无法组合多个右侧操作数以传递给单个二元运算符。

【讨论】:

  • 不是答案,对寻找答案没有帮助。
  • @Dan Andrews 所以“不,这是不可能的”不是答案吗?我相当有信心,没有办法在语法上使用多个操作数组合单个比较运算符。当被比较的事物属于不同类型时,您的上述回答无济于事。
  • @Jeff:很抱歉让您不高兴。但是您的回答无助于找到解决方案,也没有提出解决方案。你应该刚刚发表评论。您对使用多个操作数的评论表明您没有理解这个问题。
  • 首先,我并不难过。我理解为什么你说我的答案不是答案,我不同意你的逻辑。那里有区别。但是,您认为我不理解这个问题的假设——我做得非常好——是无效的。据我所知,在当前的 C# 语法集中,无法组合多个 RHS 操作数以传递给单个二元运算符。对于非常特定的类型,有一些非常特定的解决方法,但从长远来看这并没有用。我将编辑我的答案,以便更清楚地表达我的意思。
  • 问题是......已经有一些答案了。 “x == 6,7”格式在技术上可能不可行,但有问题意图的答案。 “这是不可能的,因为 FOO,但是这就是你如何做你所要求的......做 BAR”将是一个很好的答案。 “那不可能”是一个无助于解决问题的蹩脚答案。
【解决方案2】:

没有办法做到这一点,但你当然可以使用if( index >=7 && index <= 8 ) 做一个范围。但是给它一个数字列表将需要您创建一个数组或列表对象,然后使用一种方法来执行此操作。但这只是矫枉过正。

【讨论】:

  • 虽然肯定不如 48klocs 的那么棒,但我认为答案没有错。 没有创建一个列表/方法是没有办法的。 48kloc 的答案绝对是优雅的,但在性能方面,这很糟糕。
  • 您的答案是使用范围。问题是针对像 SQL 这样的 IN 子句。我没有对你投反对票,我只是认为这不值得+3,因为你没有在问题的范围内回答。除非你误解了范围......
【解决方案3】:

编写您自己的扩展方法,以便您可以编写

if (index.Between(7, 8)) {...}

其中Between定义为:

    public static bool Between (this int a, int x, int y)
    {
        return a >= x && a <= y;
    }

【讨论】:

  • 我猜你有一个 +4 来提及扩展方法,因为你的解决方案不能满足问题的需要。 :)
  • 虽然这种扩展方法肯定有用,但问题是如何组合多个条件,而不是如何确定值是否在某个范围内。
【解决方案4】:

你可以用这个:

 if (new List<int>() { 7, 8 }.Contains(index))

【讨论】:

  • 为了减少字符,你可以这样做if (new int[] { 7, 8 }.Contains(index))
  • 我将写一个相当长的段落,需要更多的努力阅读,而不是简单地提到使用列表来满足检查两个数字是多么夸张同一点:无论如何,使用列表并不比仅在两个条件下比较变量更简洁、更有效。
  • @Brad:他可以有 20 个条件。为什么要费心把这些都写出来?
  • @AresAvatar:因为列表是资源过度杀伤。并且,在多数比较的情况下,存在 case 语句。 -- 编辑:我不会投反对票,因为它是一个可行的选择,这只是使用大锤悬挂图片的本质。
  • @Brad:是否矫枉过正是程序员最好做出的决定,而不是这个例子,你也可以使列表(或数组)静态。我们正在建设性地回答海报,而你没有。
【解决方案5】:
if ((new int[]{7,8}).Contains(index))

【讨论】:

  • 这个答案是错误的。它不组合多个条件表达式,而是通过调用完全不同的方法来避免它们,这可能无法编译甚至在极端情况下给出不同的答案。 (不确定int[] 是否可能有不同的答案,但如果使用int 以外的类型,一般来说肯定是可能的)。这只是说,从一个不清楚的问题开始,任何答案都可以说是错误的!
  • 他不需要多个条件表达式,也从未在问题中这么说。由于选择的正确答案与此非常相似,恐怕您的评论已关闭。我的回答是按照作者的意图解决问题。您因不允许使用多个条件表达式而对我投反对票的理由是错误的。哦,好吧。
  • 如果您阅读问题的标题,您可以看到作者要求组合多个条件表达式。另外,我看不出反对票的假设是从哪里来的。
  • 这整个线程是一场灾难。错误的答案被投票,正确的答案没有投票,昂贵的答案被严重投票,现在作者决定给自己正确的答案......这是错误的,因为它是按位的。
【解决方案6】:

您可以将需要比较的值放入内联数组并使用 Contains 扩展方法。对于初学者,请参阅this article

几个sn-ps演示了这个概念:

int index = 1;
Console.WriteLine("Example 1: ", new int[] { 1, 2, 4 }.Contains(index));

index = 2;
Console.WriteLine("Example 2: ", new int[] { 0, 5, 3, 4, 236 }.Contains(index));

输出:

Example 1: True
Example 2: False

【讨论】:

  • 我比接受的答案更喜欢这个,因为它很清楚。我仍然会在我的代码中查看这个常量列表,并想知道它们是否不能被提取到其他系统中。有一些任意数字列表(甚至枚举)只是一种糟糕的代码气味
  • @Bill K:我同意我的 sn-p,就目前而言,不适合生产。它旨在尽可能清楚地展示这个概念。对于生产,我建议使用一个有意义的名称的常量数组。
  • 这样的一组值暗示了某种持久性——只要你有一个这样的数字列表,它们很有可能会改变并且可能应该是数据。如果它是从文件中读取的像“validCodes”这样的数组——这会突然变得有趣,但在这种情况下你的解决方案是完美的。
【解决方案7】:

您可以使用扩展方法来完成此操作。

public static bool In<T>(this T obj, params T[] collection) {
   return collection.Contains(obj);
}

那么……

if(index.In(7,8))
{
    ...
}

【讨论】:

  • +1 这非常好。我不知道这有多矫枉过正,但它很花哨!希望我能投票两次
  • +1 非常酷的解决方案。可能有点矫枉过正(尤其是对于 2 个数字的列表),但非常酷。
  • 这肯定会进入我的分机。方法库
  • 虽然这是一个聪明的解决方案,但我不禁认为它是 a) 矫枉过正且过于昂贵 b) 没有解决 为什么 存在这样的根本问题OP 代码中进行了许多“幻数”比较。
  • +1 不错的解决方案。每个担心过度杀伤和使用文字的人都应该考虑 OP 给出了一个一般问题的简单示例的可能性。此外,如果发现问题,可以测量和调整性能,但我怀疑这个例程在绝大多数使用情况下会在可接受的范围内执行。
【解决方案8】:
switch (GetExpensiveValue())
{
case 7: case 8:
   // do work
   break;
}

这显然需要更多的代码,但它可以让您免于多次评估函数。

【讨论】:

    【解决方案9】:

    你需要这样的东西吗

            int x = 5; 
    
            if((new int[]{5,6}).Contains(x)) 
            {
                Console.WriteLine("true");
    
    
            }
            Console.ReadLine();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-15
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 2017-10-07
      相关资源
      最近更新 更多