我经常发现自己编写代码,其中变量可以是A或B,例如当我在转发器上调用OnItemDataBound时:
protected void repeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{}
}
我经常想,必须有一种更简单的方法。我想写一些类似的东西:
if(x == (1 || 2))
SQL有IN(..)运算符,C#中有类似的内容吗?
WHERE x IN(1,2)
我知道我可以使用switch语句,但这并不简单。如果可能的话,我希望它在If语句中完成。
答案 0 :(得分:15)
我觉得它很好;但是,你可以这样做:
// note the array is actually mutable... just... don't change the contents ;p
static readonly ListItemType[] specialTypes =
new[]{ListItemType.Item, ListItemType.AlternatingItem};
并检查:
if(specialTypes.Contains(e.Item.ItemType)) {
// do stuff
}
但是要强调:我实际上只是在这里使用switch
,因为switch
对整数和枚举有特殊的IL处理,通过跳转表,使它非常有效:
switch(e.Item.ItemType) {
case ListItemType.Item:
case ListItemType.AlternatingItem:
// do stuff
break;
}
答案 1 :(得分:12)
您可以编写如下的扩展方法:
public static bool In<T>(this T x, params T[] values)
{
return values.Contains(x);
}
并称之为:
1.In(2,3,4)
但我会说这不值得。
答案 2 :(得分:7)
如果你想模仿SQL IN语句你可以做这样的事情...对于有2个项目的简单情况,这可能并不简单,但对于更多项目,它肯定会是。
(new[] { 1, 2 }).Contains(x);
答案 3 :(得分:1)
您可以使用this Answer
中的以下方法public static bool In<T>(this T source, params T[] list)
{
if(null==source) throw new ArgumentNullException("source");
return list.Contains(source);
}
这样打电话:
if(x.In(1,2,4))
{
// ...
}
答案 4 :(得分:0)
除非单个if
有很多 选项,否则您的代码可读且清除,这是最重要的。
如果经常满足if
更多3条件,则可以使用
new List<..>{ condition1, condition2, ... ConditionN}.Any<>()
。
类似的东西。
答案 5 :(得分:0)
我认为这就像你要得到的一样简单。注意其他答案甚至你自己的建议实际上是如何使用特殊的结构和变通方法来缩短一些简单的语法。此外,这些聪明的解决方法将阻碍性能。
但是,对于使用大量空间的两到三个项目,我喜欢将条件放在后续行上,以使阅读更容易。
if (x == MyEnum.SomeReallyLongNameThatEatsUpTheLine ||
x == MyEnum.TheOtherNameThatWastesSpace)
{
// The simplest code.
}
我想如果你有一个很长的可能值列表,阵列方法要好得多。