C# C语言中的in运算符#
我认为Commodore 128 Basic中有一个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()或其他方法替换以下语句吗
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");