C#中类似Delphi的in关键字的等效写法是什么?

11

在C#中,类似于Delphi的in语法的等效语法是什么,例如:


  if (iIntVar in [2,96]) then 
  begin
    //一些代码
  end;

该段代码是一个条件语句,如果变量 iIntVar 的值为 2 或 96,则执行注释中的代码。

感谢您的提议。


1
这里有一个类似的问题正在流传,网址为https://dev59.com/sXE95IYBdhLWcg3wV8W_#2357002。 - Mark
1
相似,但在我看来不足以进行近距离投票。 - Randolpho
不,不是这样的问题。类似的问题是这个:https://dev59.com/6EzSa4cB1Zd3GeqPjyFi - Rob Kennedy
7个回答

9
我更喜欢这里定义的方法:比较一个变量与多个值 以下是 Chad 帖子的转换:
public static bool In(this T obj, params T[] arr)
{
    return arr.Contains(obj);
}

并且使用方法将会是:
if (intVar.In(12, 42, 46, 74) ) 
{ 
    //TODO: Something 
} 

或者

if (42.In(x, y, z))
    // do something

5

没有完全等价的方法。最接近的是集合的Contains()扩展方法。

示例:

var vals = new int[] {2, 96};
if(vals.Contains(iIntVar))
{
  // some code
}

1
没有这样的等价物。Containsin不是一样的吗?它们都只是检查值是否在数组中。 - James
仅包含检查那些不在它们之间的值,请参见http://www.delphibasics.co.uk/RTL.asp?Name=In - Johnno Nolan
@James:'Contains' 的作用与 'in' 相同,但它不是由编译器控制的语法习惯,而是一个库调用。没有这样的语言对应,只有库支持。 - Randolpho
1
@John Nolan:@Pascal并没有使用[2..96],他使用的是[2,96][2,96]创建了一个包含值2和96的列表。如果他使用了[2..96],那么它将会创建一个包含值2、3、4、5、6、7、...、95、96的数组。此时,他将会检查两个数字之间的值,并且最好使用下限和上限检查,而不是数组包含性检查,这就是Delphi中in运算符所做的事情。 - Randolpho
3
实际上,[2..96]会创建一个包含值2到96的集合,使用更少的字节来表示,并且可以在O(1)时间内进行测试,而不是需要进行线性搜索的数组扫描。 - Mason Wheeler
@Mason Wheeler:非常好的观点。事实上,即使是 [2,96],它们也都是集合,而且 Delphi 中检查集合的常数时间确实很好;我忘记了这一点。愚蠢的我花太多时间在 C# 上了。 - Randolpho

5
在.Net中,.Contains是最接近的方法,但语法与你所写的相反。你可以编写一个扩展方法来创建.In方法。
public static bool In<T>(this T obj, IEnumerable<T> arr)
 {
  return arr.Contains(obj);
 }

并且使用方法将会是:
if (42.In(new[] { 12, 42, 46, 74 }) )
{
    //TODO: Something
}

7
使用参数数组可以使语法更加简洁。42.In(12,42,46,74); - Mark
@Mark,+1,确实如此,但另一方面,这取决于您的数组是否已经在变量中。在我看来,应该是这样的,因为魔术数字列表是代码异味。在这种情况下,IEnumerable允许您传递一个数组、List等。 - CaffGeek
你仍然可以传入一个数组,但是你将被限制在数组中。我同意关于魔数的观点。当检查枚举时,我使用过这个方法(例如 state.In(Closed,Closing,Unavailable) ...等等)。 - Mark

3
您可以创建这个扩展方法:
public static class ExtensionMethods
{
    public static bool InRange(this int val, int lower, int upper)
    {
        return val >= lower && val <= upper;
    }
}

那么你可以这样做:
int i = 56;
if (i.InRange(2, 96)) { /* ... */ }

3

扩展Mason Wheeler在评论中写的内容,这将是HashSet<T>.Contains(在.NET 3.5下)。

int i = 96;
var set = new HashSet<int> { 2, 96 };

if (set.Contains(i))
{
   Console.WriteLine("Found!");
}

2

你可以编写一个扩展方法

 public static bool In(this int value, int[] range)
    {
        return (value >= range[0] && value <= range[1]);
    }

1
我知道这是一个老话题,但我喜欢这个因为它更简洁。(在.NET 6中测试过)
public static class FooUtils
{
    public static bool In(this object obj, params object[] arr)
    {
        return arr.Contains(obj);
    }
}

使用方法:

int myNumber = 5;
if (myNumber.In(1, 5, 10))
{
    // do something                
}

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