C# C语言中的in运算符#

C# C语言中的in运算符#,c#,syntax,enums,C#,Syntax,Enums,我认为Commodore 128 Basic中有一个in操作员。 c#中也有in操作符吗 我的意思是有这样的接线员吗 if(aString in ["a", "b", "c"]) Console.Out.WriteLine("aString is 'a', 'b' or 'c'"); Edit1:目前我需要它来确定枚举值是否在某些枚举值的范围内 Edit2:感谢大家提供的Contains()解决方案。我将来会用它。但目前我需要枚举值。我可以用Contains()或其他方法替换以下语句吗

我认为Commodore 128 Basic中有一个in操作员。
c#中也有in操作符吗

我的意思是有这样的接线员吗

if(aString in ["a", "b", "c"])  
  Console.Out.WriteLine("aString is 'a', 'b' or 'c'");
Edit1:目前我需要它来确定枚举值是否在某些枚举值的范围内

Edit2:感谢大家提供的Contains()解决方案。我将来会用它。但目前我需要枚举值。我可以用Contains()或其他方法替换以下语句吗

public enum MyEnum { A, B, C }

class MyEnumHelper
{
  void IsSpecialSet(MyEnum e)
  {
    return e in [MyEnum.A, MyEnum.C]
  }
}
Edit3:对不起,这不是基本的。我只是在谷歌上搜索了一会儿,发现Turbo Pascal是我可以看到的候选人。看

编辑4:迄今为止的最佳答案(2012年2月15日结束):

  • 对于列表和数组:接受答案和所有其他答案 包含()个解决方案
  • 对于Enum:Kaneda的答案中有一个很好的优点/缺点列表 不同的扩展方法
试试这个:

if(new [] {"a", "b", "c"}.Contains(aString))  
    Console.Out.WriteLine("aString is 'a', 'b' or 'c'");
if ("abc".Contains(aString[0])) 
  Console.WriteLine("aString is 'a', 'b' or 'c'");

这将使用该方法在数组中搜索aString

大多数集合都有一个.Contains方法,而LINQ也有一个Contains方法,因此任何尚没有自己的Contains方法的可枚举对象都会从LINQ获得一个方法。

否。您可以接近:

if (new [] { "a", "b", "c" }.Contains(aString))
    Console.Out.WriteLine("aString is 'a', 'b' or 'c'");

根据您的代码,您要查看aString是否等于“a”、“b”或“c”,而不是它是否包含“a”、“b”或“c”。如果我读对了问题,那么:

不。相反,您应该使用switch语句

switch(aString)
{
   case "a:":
   case "b:":
   case "b:":
      Console.Out.WriteLine("aString is 'a', 'b' or 'c'"); 
   default:
      Console.Out.WriteLine("aString is NOT 'a', 'b' or 'c'"); 
}
C#中的等价项是(假设您有一个数据列表或数组)


使用contains方法:

string[] values = { "A", "B", "C" };

if (values.Contains("A"))           //True
    MessageBox.Show("A is there");

if (values.Contains("b"))               //false, strings are case sensitive
    MessageBox.Show("b is there");  

in关键字仅与foreach一起使用。 不,没有这样一个运营商专门用于这样的目的。但您可以使用数组类型或列表类型的内置方法,如下所示:

        string aString = "a";
        string[] strings = new string[] { "a", "b", "c" };
        if (strings.Contains(aString)) //Contains here is a Linq extension
            Console.WriteLine("aString is either a, b, or c");

        List<string> stringList = new List<string>() { "a", "b", "c" };
        if(stringList.Contains(aString)) //Contains here is a member method
            Console.WriteLine("aString is either a, b, or c");

        if(stringList.IndexOf(aString) != -1)
            Console.WriteLine("aString is either a, b, or c");
string aString=“a”;
字符串[]字符串=新字符串[]{“a”、“b”、“c”};
if(strings.Contains(aString))//Contains这里是一个Linq扩展
Console.WriteLine(“aString是a、b或c”);
List stringList=新列表(){“a”、“b”、“c”};
if(stringList.Contains(aString))//Contains这里是一个成员方法
Console.WriteLine(“aString是a、b或c”);
if(stringList.IndexOf(aString)!=-1)
Console.WriteLine(“aString是a、b或c”);

如果您想要更流畅的工作方式,可以使用扩展方法,因此对于客户和客户状态的示例:

public enum CustomerStatus
{
    Active,
    Inactive,
    Deleted
}

public class Customer
{
    public CustomerStatus Status { get; set; }
}
使用以下扩展方法:

public static class EnumExtensions
{
    public static bool In(this Enum value, params Enum[] values)
    {
        return values.Contains(value);
    }
}
要允许您编写如下代码:

private void DoSomething()
{
        var customer = new Customer
        {
            Status = CustomerStatus.Active
        };

        if (customer.Status.In(CustomerStatus.Active, CustomerStatus.Inactive))
        {
            // Do something.
        }
}

要回答Andrew Hare回答的后续问题,可以将扩展方法中的
限制为单个枚举。不要接受这个答案,因为Andrew和Trevor回答了修改后的问题(而且大多数人都回答了原来的问题…无论如何)

总而言之,这是我发现最有用的:

但是,如果您真的想限制它,只需将枚举的类型用作参数,而不是泛型(或枚举):

我发现它不如我所联系的通用方法——或者特雷弗的方法——有用,但你看

更新

两种方法之间的差异:

  • 使用Trevor的方法,编译器将接受上面代码中所有三种敌人和朋友的混合(输出将为“真”、“假”、“假”、“假”、“真”)

  • 使用泛型方法,最后一个参数将被接受(且为“True”),因为泛型仅确保所有参数(包括
    )的类型相同。也就是说,它不接受在同一个调用中混合不同的枚举

  • 同样,上面的方法将只接受您为其设计扩展方法的一个枚举


我很惊讶没有人提议切换

class MyEnumHelper 
{ 
    void IsSpecialSet(MyEnum e) 
    { 
        return e in [MyEnum.A, MyEnum.C] 
        switch (e)
        {
            case MyEnum.A:
            case MyEnum.C:
                return true;
            default:
                return false;
        }
    } 
} 
试试这个:

if(new [] {"a", "b", "c"}.Contains(aString))  
    Console.Out.WriteLine("aString is 'a', 'b' or 'c'");
if ("abc".Contains(aString[0])) 
  Console.WriteLine("aString is 'a', 'b' or 'c'");

多亏了我的Delphi时代,我也习惯了它在关键字中的。对于C#中的一般情况,我使用:

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

Enum有相关的解决方案吗?@brgerner:要了解一些语法上的优点和缺点,请参阅-允许您执行
if(MyEnumValue.In(MyEnum.First,MyEnum.Second,MyEnum.Third)){…}
@如果可以将扩展方法仅分配给我的枚举,那就太完美了。更新到我的最后一条评论:Trevor Pilley的答案解决了这个问题。不是我的扩展方法,但这是可能的。添加答案,因为演示需要空间。不过,不要接受它——因为我们离你原来的问题很远,这是不“公平的”。@DavidStratton实际上我不认为是这样。根据你的代码,你想看看aString是否等于“a”、“b”或“c”,而不是它是否包含“a”、“b”或“c”。是这样吗?我看Commodor 128 basic已经好几年了,但如果我没记错的话,这看起来像是典型的分支代码。我不记得C-128 basic中的分支代码(尽管你把我带回去…),但这与python语法非常接近。是的,在我能记得的任何1980年代的basic中,
中都没有。@dav我指的是相同的东西,而不是包含的东西。或者,re:@AndrewHare的答案,你可以做:
返回新的[]{MyEnum.A,MyEnum.C}.Contains(e)。或者,使用我的注释中的链接扩展方法:
返回e.in(MyEnum.A,MyEnum.C)
但是他的问题是这样写的,目的是展示询问者想要使用语言的方式,而不是实际的商业目的。谢谢!现在是最好的答案了。一个通用的扩展方法会更有用:
publicstaticbool-In(thistt-value,paramst[]values){returnvalues.Contains(value);}
。是的,我将它指定为枚举,因为@brgerner就是这么问的。其他人也发布了使用泛型的示例。
public static class Helper
{
    public static bool In<T>(this T t, params T[] args)
    {
      return args.Contains(t);
    }
  }
}
  var color = Color.Aqua;
  var b = color.In(Color.Black, Color.Blue);
  b = "hello".In("hello", "world");