if语句有多个条件而不是使用AND

时间:2018-05-01 09:35:12

标签: c#

我一直在搜索有关if语句的一些信息,但是找不到与myquestion相对应的内容。

我想知道你是否可以写:

int n = 3
if (3 < n < 20)
{
   //do something..
}

而不是:

if (n > 3 && n < 20)
{
   //do something..
}

第一句话对我来说并不适用,我觉得应该这样,因为它很简单。

也许有人可以给我正确的语法,或者说它根本不可能,我只需要使用AND。

3 个答案:

答案 0 :(得分:9)

解释它无效的原因:

if (3 < n < 20)

可以改写为:

if ((3 < n) < 20)

现在3 < n的结果将是一个布尔。

所以基本上你会得到:

if (true/false < 20)

在C#中无效。

答案 1 :(得分:4)

斯特凡的回答解释了为什么这是不可能的 但是这里有一个解决方法,如果你不想每次都写出令人讨厌的&&显式条件 - 你可以创建一个扩展方法:

public static class IComparableExtensions
{
    public static bool Between<T>(this T self, T low, T high) where T : IComparable
    {
        return self.CompareTo(low) > 0 && self.CompareTo(high) < 0;
    }
}

并像这样使用它:

int n = 5;
if(n.Between(3, 20))
{
    // do your stuff here
}

但请注意,这可能会造成混淆 - 因为Between没有指定比较是否包含在一个方向的包容性,排他性或包容性 - 所以如果比较,比如{{1} } - 它应该返回true还是false?

更好的方法是需要在方法中添加另一个变量,以表明:

20.Between(10, 20)

现在你这样使用它:

[Flags]
public enum CompareMode
{
    Exclusive = 0,
    IncludeLow = 1,
    IncludeHigh = 2,
    Inclusive = IncludeLow | IncludeHigh
}

public static class IComparableExtensions
{
    public static bool Between<T>(this T self, T low, T high, CompareMode mode) where T : IComparable
    {
        var compareLow = (mode & CompareMode.IncludeLow) == CompareMode.IncludeLow ? 0 : 1;
        var compareHigh = (mode & CompareMode.IncludeHigh) == CompareMode.IncludeHigh ? 0 : -1;
        return self.CompareTo(low) >= compareLow && self.CompareTo(high) <= compareHigh;
    }
}

You can see a live demo on rextester.

这样,另一个阅读此代码的人(或者甚至是你,6个月后)将立即知道,而不必查看if(n.Between(3, 20, CompareMode.Exclusive)) { // do your stuff here } 扩展方法,如果介于两者之间是包容性,排他性或其他什么。< / p>

答案 2 :(得分:0)

一般来说,你不想做什么。

但在您的逻辑中,如果您想执行单线性逻辑,则可以使用三元运算符。

例如。你需要将n的值赋给variblae result,否则它应该是0默认值。

int result = n > 3 ? (n < 20 ? n : 0) : 0

等同于

int result = 0;
if (n > 3 && n < 20)
{
   result = n;
}