if语句匹配多个值

时间:2010-10-11 14:49:31

标签: c# if-statement

编写if语句的更简单方法是什么?

if (value==1 || value==2)

例如......在SQL中,您可以说where value in (1,2)而不是where value=1 or value=2

我正在寻找可以使用任何基本类型... string,int等的东西。

15 个答案:

答案 0 :(得分:118)

怎么样:

if (new[] {1, 2}.Contains(value))

虽然这是一个黑客:)

或者,如果您不介意创建自己的扩展方法,可以创建以下内容:

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

你可以像这样使用它:

if (1.In(1, 2))

:)

答案 1 :(得分:35)

更复杂的方式:)模拟SQL的'IN':

public static class Ext {    
    public static bool In<T>(this T t,params T[] values){
        foreach (T value in values) {
            if (t.Equals(value)) {
                return true;
            }
        }
        return false;
    }
}

if (value.In(1,2)) {
    // ...
}

但是要采用标准方式,它更具可读性。

根据@Kobi的建议,

编辑:更好的解决方案:

public static class Ext {    
    public static bool In<T>(this T t,params T[] values){
        return values.Contains(t);
    }
}

答案 2 :(得分:24)

这是你在找什么?

if (new int[] { 1, 2, 3, 4, 5 }.Contains(value))

答案 3 :(得分:6)

如果你有一个List,你可以使用.Contains(yourObject),如果你只是在寻找它(就像在哪里)。否则请查看Linq .Any()扩展方法。

答案 4 :(得分:6)

或者,如果将来测试1或2以外的值,这将为您提供更大的灵活性,是使用switch语句

switch(value)
{
case 1:
case 2:
   return true;
default:
   return false
}

答案 5 :(得分:5)

使用Linq,

if(new int[] {1, 2}.Contains(value))

但我必须认为原来的if更快。

答案 6 :(得分:5)

如果您在长列表中多次搜索固定值列表中的值,则应使用 HashSet&lt; T&gt; 。如果列表非常短(<~20项),则基于此测试,List可以具有更好的性能 HashSet vs. List performance

HashSet<int> nums = new HashSet<int> { 1, 2, 3, 4, 5 };
// ....
if (nums.Contains(value))

答案 7 :(得分:3)

一般来说,没有。

是的,有些情况下列表位于ArrayList,但这不是一般情况。

答案 8 :(得分:3)

C# 9 直接支持:

if (value is 1 or 2)

然而,在许多情况下:switch 可能更清晰(尤其是使用更新的 switch 语法增强)。您可以看到此 here,其中 if (value is 1 or 2) 的编译方式与 if (value == 1 || value == 2) 相同。

答案 9 :(得分:1)

使用扩展方法:

public static class ObjectExtension
{
    public static bool In(this object obj, params object[] objects)
    {
        if (objects == null || obj == null)
            return false;
        object found = objects.FirstOrDefault(o => o.GetType().Equals(obj.GetType()) && o.Equals(obj));
        return (found != null);
    }
}

现在你可以这样做:

string role= "Admin";
if (role.In("Admin", "Director"))
{ 
    ...
} 

答案 10 :(得分:1)

更容易是主观的,但也许switch语句会更容易?您不必重复该变量,因此更多值可以适合该行,并且具有许多比较的行比使用if语句的对应物更易读。

答案 11 :(得分:1)

像这样的扩展方法会这样做......

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

像这样使用:

Console.WriteLine(1.In(1,2,3));
Console.WriteLine("a".In("a", "b"));

答案 12 :(得分:1)

在vb.net或C#中,我希望将变量与任何合理数量的单独命名对象(与集合中的所有内容相对)进行比较的最快通用方法是简单地将每个对象与与你所做的完全相同。当然可以创建一个集合的实例并查看它是否包含该对象,并且这样做可能比将对象单独地与所有项目进行比较更具表现力,但除非使用编译器可以明确识别的构造,否则这样的代码几乎肯定会比单纯进行个别比较慢得多。如果代码本质上每秒最多运行几百次,我不会担心速度,但是我会警惕代码被重新用于比原先预期更频繁的代码。

另一种方法,如果变量类似于枚举类型,则选择两个幂的枚举值以允许使用位掩码。如果枚举类型具有32个或更少的有效值(例如,开始Harry = 1,Ron = 2,Hermione = 4,Ginny = 8,Neville = 16),可以将它们存储在一个整数中,并在一个整数中检查多个位操作((if((thisOne&amp;(Harry | Ron | Neville | Beatrix))!= 0)/ *做一些事情* /。这将允许快速编码,但仅限于具有少量值的枚举。 / p>

一种更强大的方法,但必须谨慎使用的方法是使用值的某些位来指示某些内容的属性,而其他位用于标识该项。例如,位30可以指示字符是男性,位29可以指示哈利的朋友等,而较低位区分字符。这种方法允许添加可能是也可能不是哈利的朋友的角色,而不需要检查哈利的朋友改变的代码。这样做的一个警告是,必须区分用于设置枚举值的枚举常量和用于测试枚举值的枚举常量。例如,要设置一个变量来指示Harry,可能需要将其设置为0x60000001,但是为了查看变量IS Harry,应该使用0x00000001对其进行位测试。

另一种方法,如果可能值的总数是中等的(例如16-16,000左右),则可能是有用的,即具有与每个值相关联的标志数组。然后可以编写类似“if((characterAttributes [theCharacter]&amp; chracterAttribute.Male)!= 0)”的代码。当字符数相当小时,这种方法效果最好。如果数组太大,缓存未命中可能将代码放慢到可以更快地针对少量字符进行测试的程度。

答案 13 :(得分:0)

public static bool EqualsAny<T>(IEquatable<T> value, params T[] possibleMatches) {
    foreach (T t in possibleMatches) {
        if (value.Equals(t))
            return true;
    }
    return false;
}
public static bool EqualsAny<T>(IEquatable<T> value, IEnumerable<T> possibleMatches) {
    foreach (T t in possibleMatches) {
        if (value.Equals(t))
            return true;
    }
    return false;
}

答案 14 :(得分:-1)

我遇到了同样的问题但是用switch语句解决了这个问题 开关(您正在打开的值) { 情况1:       你想要发生的代码; 案例2:    你想要发生的代码; 默认:    返回一个值 }