将变量与多个值进行比较

时间:2010-03-01 15:41:52

标签: c#

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

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#中有更整洁的方式吗?

7 个答案:

答案 0 :(得分:74)

你可以用.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)){}

答案 1 :(得分:10)

还有switch语句

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

答案 2 :(得分:7)

假设type是枚举,您可以使用FlagsAttribute

[Flags]
enum BillType
{
    None = 0,
    Bill = 2,
    Payment = 4,
    Receipt = 8
}

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

答案 3 :(得分:3)

尝试使用开关

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

        break;
    }

答案 4 :(得分:0)

尝试使用C#HashSet获取值列表。如果您需要将多个值与单个值集进行比较,这将非常有用。

答案 5 :(得分:0)

尝试查看策略设计模式(a.k.a.策略设计模式)。

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的great post on how to dynamically resolve the policy

答案 6 :(得分:0)

如何获取所有Enums值的数组并迭代这个?

http://maniish.wordpress.com/2007/09/27/iterate-through-enumeration-c/