Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#中,是否有一种简单的方法来测试值是否在内联编码集中?_C#_Arrays_Linq_Set - Fatal编程技术网

在c#中,是否有一种简单的方法来测试值是否在内联编码集中?

在c#中,是否有一种简单的方法来测试值是否在内联编码集中?,c#,arrays,linq,set,C#,Arrays,Linq,Set,在C#中,如果我想知道一个变量是否等于一组固定值中的一个,我现在就这样做 bool result = ( (x==MyEnum.A) || (x==MyEnum.B) || (x==42) ); …这对我来说很麻烦。有类似于这个伪代码的东西吗 bool result = x in {MyEnum.A, MyEnum.B, 42}; 我知道我可以创建一个与值内联的数组,然后在该数组中使用LINQ,但是还有其他选项吗?使用LINQ,您可以通过使用以下命令来反转此操作(如果x在列表中,则进行测试)

在C#中,如果我想知道一个变量是否等于一组固定值中的一个,我现在就这样做

bool result = ( (x==MyEnum.A) || (x==MyEnum.B) || (x==42) );
…这对我来说很麻烦。有类似于这个伪代码的东西吗

bool result = x in {MyEnum.A, MyEnum.B, 42};

我知道我可以创建一个与值内联的数组,然后在该数组中使用LINQ,但是还有其他选项吗?

使用LINQ,您可以通过使用以下命令来反转此操作(如果
x
在列表中,则进行测试):


您可以利用Enumerable.Contains()扩展方法,该方法可用于所有IEnumerable类型:

public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value);
或者更好:

创建扩展方法:

    public static bool ContainedIn(this MyEnum input, params MyEnum[] parameters)
    {
        return parameters.Contains(input); 
    }
//Generic.  All items in the set and the candidate must be the same type.
public static bool In<T>(this T item, params T [] set)
{
  return set.Contains(item);
}

bool result = x.In(MyEnum.A, MyEnum.B, MyEnum.C);

//Non-generic and non-typesafe.  Anything goes.  Use with care!
public static bool In(this object item, params object [] set)
{
  return set.Contains(item);
}


bool result = x.In(MyEnum.A, MyEnum.B, 42);

//int-specific.  
public static bool In(this int item, params int [] set)
{
  return set.Contains(item);
}


bool result = x.In((int)MyEnum.A, (int)MyEnum.B, 42);
var result=x.ContainedIn(MyEnum.A,MyEnum.B)


如果要允许多个类型,可以使用object作为参数类型

如果列表太长,但查找的值在枚举定义中是有序的,则可以创建一个范围并对其调用Contains(),如下所示:

bool result = Enumerable.Range((int)MyEnum.First,(int)MyEnum.Last)
                        .Contains((int)x);

在上面的条件下,这会很有用,但我想发布这篇文章,因为您不想创建内联数组。

这可能是个坏主意,但您可以使用新的扩展方法打开Contains,获得与您在问题中提出的语法类似的语法:

    public static bool ContainedIn(this MyEnum input, params MyEnum[] parameters)
    {
        return parameters.Contains(input); 
    }
//Generic.  All items in the set and the candidate must be the same type.
public static bool In<T>(this T item, params T [] set)
{
  return set.Contains(item);
}

bool result = x.In(MyEnum.A, MyEnum.B, MyEnum.C);

//Non-generic and non-typesafe.  Anything goes.  Use with care!
public static bool In(this object item, params object [] set)
{
  return set.Contains(item);
}


bool result = x.In(MyEnum.A, MyEnum.B, 42);

//int-specific.  
public static bool In(this int item, params int [] set)
{
  return set.Contains(item);
}


bool result = x.In((int)MyEnum.A, (int)MyEnum.B, 42);
//通用。集合中的所有项和候选项必须是同一类型。
公共静态布尔输入(此T项,参数T[]集)
{
返回集合。包含(项);
}
bool result=x.In(MyEnum.A,MyEnum.B,MyEnum.C);
//非泛型和非类型安全。什么都可以。小心使用!
公共静态布尔输入(此对象项,参数对象[]集)
{
返回集合。包含(项);
}
bool result=x.In(MyEnum.A,MyEnum.B,42);
//int-specific。
公共静态布尔输入(此int项,参数int[]集)
{
返回集合。包含(项);
}
bool result=x.In((int)MyEnum.A,(int)MyEnum.B,42);

这是否为您编译?我得到‘错误CS0820:无法使用数组初始值设定项初始化隐式类型的局部变量’这是错误的,您必须将int转换为enum或enum转换为int,另一个错误是在setOk之前缺少new[],可能我这里缺少了一些内容,但您在中将扩展方法
声明为泛型,但在使用它时,您没有指定类型。该语法是否自动假定“T”是附加到它的类型(在本例中是“x”的类型)?是的。如果您想传入混合类型,例如在您的示例中,您可以使签名非泛型,并将object作为参数。或者,如果您打算将其用于枚举和int,同样,如您的示例中所示,您可以将类型声明为int,并在调用时将枚举强制转换为int。事实上,我刚刚尝试了这个方法,它成功了!:)我从来不知道泛型假设它附加到什么,因此您的
In
语句现在适用于所有类型。真他妈甜!给了我我想要的(内联)并教了我一些关于C#泛型的新东西作为奖励!我们有一个Winnarrr!仅供参考,我们将其添加到System.Linq名称空间中,因此每当我们为其添加using时,我们也会自动获得此名称空间。再说一次,真他妈的甜蜜@马奎夫:仅供参考,这叫做泛型推理。投票给你,因为这与我接受的答案相似:不同之处在于,在他的案例中,他在扩展方法上使用了泛型,所以我们可以在任何情况下使用它。
//Generic.  All items in the set and the candidate must be the same type.
public static bool In<T>(this T item, params T [] set)
{
  return set.Contains(item);
}

bool result = x.In(MyEnum.A, MyEnum.B, MyEnum.C);

//Non-generic and non-typesafe.  Anything goes.  Use with care!
public static bool In(this object item, params object [] set)
{
  return set.Contains(item);
}


bool result = x.In(MyEnum.A, MyEnum.B, 42);

//int-specific.  
public static bool In(this int item, params int [] set)
{
  return set.Contains(item);
}


bool result = x.In((int)MyEnum.A, (int)MyEnum.B, 42);