将一个变量与多个值进行比较

53

在我的代码中,经常需要将一个变量与多个值进行比较:

if ( type == BillType.Bill || type == BillType.Payment || type == BillType.Receipt )
{
  // Do stuff
}

我一直在想我能做:

if ( type in ( BillType.Bill, BillType.Payment, BillType.Receipt ) )
{
   // Do stuff
}

当然,这是SQL的功劳。

在C#中有更简洁的方法吗?


1
类似Python和Ruby这样的语言也有“in”运算符。 - Can Berk Güder
@Can Berk Güder:我刚在寻找Ruby中的“in”运算符,但是找不到或类似的东西。有什么想法吗? - Mongus Pong
7个回答

88
您可以这样使用 .Contains
if (new[] { BillType.Receipt, BillType.Bill, BillType.Payment}.Contains(type)) {}

或者,创建自己的扩展方法,使用更易读的语法进行操作。

public static class MyExtensions
{
    public static bool IsIn<T>(this T @this, params T[] possibles)
    {
        return possibles.Contains(@this);
    }
}

然后通过以下方式调用:

if (type.IsIn(BillType.Receipt, BillType.Bill, BillType.Payment)) {}

扩展,毫无疑问。我真的认为Enum类应该有一个类似的方法来处理这个问题。要么LINQ环境应该添加枚举相关的函数。非常优雅的解决方案。 - tfrascaroli

13

还有switch语句

switch(type) {
    case BillType.Bill:
    case BillType.Payment:
    case BillType.Receipt:
        // Do stuff
        break;
}

11
假设 type 是一个枚举类型,你可以使用 FlagsAttribute
[Flags]
enum BillType
{
    None = 0,
    Bill = 2,
    Payment = 4,
    Receipt = 8
}

if ((type & (BillType.Bill | BillType.Payment | BillType.Receipt)) != 0)
{
    //do stuff
}

不幸的是,这只适用于尚未定义其值的枚举。在这种特定情况下,我们的BillTypes已经被定义为1-8...可悲的是..我喜欢这个的整洁程度.. - Mongus Pong
7
我建议将FlagsAttribute保留给真正意义上的“标志”(flags)。对BillType使用[Flags]属性会让我认为可以将任意组合的BillTypes应用到值上,但这显然并非事实。请修正这种用法。 - Mike Powell
在那种情况下,为什么需要对它们做相同的事情呢?在另一个系统中,BillType可能确实是一个标记。虽然你是正确的,但对我来说似乎像是代码异味。我可以把它删掉。 - Yuriy Faktorovich

4

尝试使用switch语句

 switch (type)
    {
        case BillType.Bill:
        case BillType.Payment:

        break;
    }

0

尝试查看策略设计模式(又称策略模式)。

public interface IBillTypePolicy
{
    public BillType { get; }
    void HandleBillType();
}
public class BillPolicy : IBillTypePolicy
{
    public BillType BillType { get { return BillType.Bill; } }

    public void HandleBillType() 
    { 
        // your code here...
    }
}

这里有一篇关于如何动态解析策略的绝佳文章,来自Los Techies。


好的模式,错了问题。这并没有回答原始问题! - Dan Puzey
我理解你的想法。这是一个更高级别的解决方案,如果我在代码中到处都有很多if语句,那么在某些情况下值得考虑。 - Mongus Pong

0
尝试使用 C# 的 HashSet 来存储值列表。如果您需要将许多值与单个值集进行比较,这将非常有用。

0

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