C# - IF语句的较短版本

时间:2010-12-09 14:03:40

标签: c# if-statement

是否有较短版本的IF语句来执行此操作?

if (el.type == ElementType.Type1 || el.type == ElementType.Type2)

13 个答案:

答案 0 :(得分:9)

您可以使用扩展方法,但这真的会更好吗?

将此内容放在静态类中:

public static bool IsOneOf(this ElementType self, params ElementType[] options)
{
    return options.Contains(self);
}

然后你可以这样做:

if (el.type.IsOneOf(ElementType.Type1, ElementType.Type2)) {

但是,这将比if语句慢 lot ,因为有一个隐式数组初始化后跟一个数组遍历,而不是(最多)两个比较和分支。 / p>

答案 1 :(得分:1)

考虑将ElementType定义为

enum ElementType
{
Type1,
Type2,
Type3
}

在这种特殊情况下,您可以写if(el.type<ElementType3) 默认情况下,Type1等于0,Type2等于1,等等

答案 2 :(得分:1)

如果你只有2个值,我强烈建议你使用你发布的代码,因为它可能是最具可读性,优雅和快速的代码(恕我直言)。

但如果您有更多这样的案例并且更复杂,您可以考虑使用switch语句:

switch (el.type)
{
    case ElementType.Type1:
    case ElementType.Type2:
    case ElementType.Type3:
        //code here
        break;
    case ElementType.Type4:
    case ElementType.Type5:
        //code here
        break;
    case ElementType.Type6:
        //code here
        break;
}
if statements中翻译的

将是:

if (el.type == ElementType.Type1 ||
    el.type == ElementType.Type2 ||
    el.type == ElementType.Type3 )
{
    // code here
}else if(el.type == ElementType.Type4 ||
         el.type == ElementType.Type5)
{
    // code here
}else if(el.type == ElementType.Type6)
{
    // code here
}

它们与我完全相同,但switch似乎更具可读性/更清晰,你需要输入更少(即代码长度更短):)

答案 3 :(得分:0)

你可以试试这个:

if(new [] { ElementType.Type1, ElementType.Type2 }.Contains(el.type))

(事实证明,这需要更多的人物)

答案 4 :(得分:0)

我猜你是指IN()子句还是其他一些?不是......好吧,有点......你可以这样做:

if ((new [] { ElementType.Type1, ElementType.Type2}).Contains(el.type)) {...}

但这不会像你现在所做的那样接近高效(或简短)。你也可以

if (el.type == ElementType.Type1 | el.type == ElementType.Type2)

但这不做短路评估,所以你很少想使用那个运算符。我的建议是坚持你所拥有的。

答案 5 :(得分:0)

简短的回答是否定的。没有C#语言构造可以让您组合对象比较。但正如许多人之前提到的那样,创建一个类型的集合可能是创建更短的if语句的最佳选择。然而,这在性能方面做出了相当大的牺牲。我会坚持使用OR声明。

答案 6 :(得分:0)

没有更好的方法来优化您的代码。正如其他用户所示,您可以优化if else。

但是我特别想到的一种if语句是

if(X> [Y || Z || A])

但那不存在,并且不像当前的那样干净(X> Y || X&gt; Z || X&gt; A)

(这更像是对Cody Gray的回应)

答案 7 :(得分:0)

简而言之:没有任何合理性(在代码可读性和性能优化方面合理)。我也不建议使用三元运算符进行这种比较。

实际if可以缩短为5个字符;)

bool b = (el.type == ElementType.Type1) | (el.type == ElementType.Type2);

if(b){...}

答案 8 :(得分:0)

如果这是您的代码中常见的逻辑比较,那么我只会编写一个方法来处理它。

private bool isType1OrType2(ElementType type)
{
    return type == ElementType.Type1 || type == ElementType.Type2;
}

然后你可以做

if(isType1OrType2(el.type))

您也可以将此作为扩展方法,如此

public static bool isType1OrType2(this ElementType type)
{
    return type == ElementType.Type1 || type == ElementType.Type2;
}

所以代码会读得更好

if(el.type.isType1OrType2())

但是你必须有一个静态类,但你可以决定它是否值得。我个人不会写一个方法来收集要比较的类型集合,除非你发现你正在将类型与许多不同的组合进行比较。如果这是你进行这种比较的唯一地方,我甚至根本不打扰更改代码。

答案 9 :(得分:0)

我认为没有办法优化你的陈述

答案 10 :(得分:0)

不要这样做,除非你有一个有限状态的自动机,否则它是愚蠢和令人困惑的。

enum MyEnum
{
    A,
    B,
    C

}
private readonly Dictionary<MyEnum, Action> _handlers = new Dictionary<MyEnum, Action>
                                                        {
    {MyEnum.A,()=>Console.Out.WriteLine("Foo")},
    {MyEnum.B,()=>Console.Out.WriteLine("Bar")},
    };

public static void ActOn(MyEnum e)
{
    Action handler = null;
    if (_handlers.TryGetValue(e, out handler) && handler != null)
    {
        handler();
    }
}

答案 11 :(得分:0)

另一种方法是做一些按位比较,但实际上不值得再次。

    private void ActWithCast(MyEnum e)
    {
        const int interest = (int)MyEnum.A | (int)MyEnum.B;
        if (0 != ((int)e & interest))
        {
            Console.Out.WriteLine("Blam");
        }
    }

答案 12 :(得分:0)

如果ElementType是枚举,则有一种更短的方法:

[Flags]
public enum ElementType
{
    Type1 = 1,
    Type2 = 2,
    Type3 = 4,
}
...
tElementType.HasFlag(ElementType.Type1 | ElementType.Type2);

您不需要[Flags]属性来使用HasFlag,但每个属性的值都需要遵循该模式。