Подтвердить что ты не робот

Есть ли функция "между" в С#?

Google не понимает, что "между" - это имя функции, которую я ищу, и ничего не возвращает.

Пример: я хочу проверить, находится ли 5 ​​между 0 и 10 только в одной операции

4b9b3361

Ответ 1

Нет, но вы можете написать свой собственный:

public static bool Between(this int num, int lower, int upper, bool inclusive = false)
{
    return inclusive
        ? lower <= num && num <= upper
        : lower < num && num < upper;
}

Ответ 2

Неясно, что вы подразумеваете под "одной операцией", но нет, нет метода operator/framework, который я знаю, чтобы определить, находится ли элемент в пределах диапазона.

Вы, конечно, можете сами написать метод расширения. Например, здесь, где предполагается, что интервал закрыт на обоих концах.

public static bool IsBetween<T>(this T item, T start, T end)
{
    return Comparer<T>.Default.Compare(item, start) >= 0
        && Comparer<T>.Default.Compare(item, end) <= 0;
}

И затем используйте его как:

bool b = 5.IsBetween(0, 10); // true

Ответ 3

Здесь полный класс.

/// <summary>
/// An extension class for the between operation
/// name pattern IsBetweenXX where X = I -> Inclusive, X = E -> Exclusive
/// <a href="https://stackoverflow.com/a/13470099/37055"></a>
/// </summary>
public static class BetweenExtensions
{

    /// <summary>
    /// Between check <![CDATA[min <= value <= max]]> 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">the value to check</param>
    /// <param name="min">Inclusive minimum border</param>
    /// <param name="max">Inclusive maximum border</param>
    /// <returns>return true if the value is between the min & max else false</returns>
    public static bool IsBetweenII<T>(this T value, T min, T max) where T:IComparable<T>
    {
        return (min.CompareTo(value) <= 0) && (value.CompareTo(max) <= 0);
    }

    /// <summary>
    /// Between check <![CDATA[min < value <= max]]>
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">the value to check</param>
    /// <param name="min">Exclusive minimum border</param>
    /// <param name="max">Inclusive maximum border</param>
    /// <returns>return true if the value is between the min & max else false</returns>
    public static bool IsBetweenEI<T>(this T value, T min, T max) where T:IComparable<T>
    {
        return (min.CompareTo(value) < 0) && (value.CompareTo(max) <= 0);
    }

    /// <summary>
    /// between check <![CDATA[min <= value < max]]>
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">the value to check</param>
    /// <param name="min">Inclusive minimum border</param>
    /// <param name="max">Exclusive maximum border</param>
    /// <returns>return true if the value is between the min & max else false</returns>
    public static bool IsBetweenIE<T>(this T value, T min, T max) where T:IComparable<T>
    {
        return (min.CompareTo(value) <= 0) && (value.CompareTo(max) < 0);
    }

    /// <summary>
    /// between check <![CDATA[min < value < max]]>
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">the value to check</param>
    /// <param name="min">Exclusive minimum border</param>
    /// <param name="max">Exclusive maximum border</param>
    /// <returns>return true if the value is between the min & max else false</returns>

    public static bool IsBetweenEE<T>(this T value, T min, T max) where T:IComparable<T>
    {
        return (min.CompareTo(value) < 0) && (value.CompareTo(max) < 0);
    }
}

плюс код unit test

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethodIsBeetween()
    {
        Assert.IsTrue(5.0.IsBetweenII(5.0, 5.0));
        Assert.IsFalse(5.0.IsBetweenEI(5.0, 5.0));
        Assert.IsFalse(5.0.IsBetweenIE(5.0, 5.0));
        Assert.IsFalse(5.0.IsBetweenEE(5.0, 5.0));

        Assert.IsTrue(5.0.IsBetweenII(4.9, 5.0));
        Assert.IsTrue(5.0.IsBetweenEI(4.9, 5.0));
        Assert.IsFalse(5.0.IsBetweenIE(4.9, 5.0));
        Assert.IsFalse(5.0.IsBetweenEE(4.9, 5.0));

        Assert.IsTrue(5.0.IsBetweenII(5.0, 5.1));
        Assert.IsFalse(5.0.IsBetweenEI(5.0, 5.1));
        Assert.IsTrue(5.0.IsBetweenIE(5.0, 5.1));
        Assert.IsFalse(5.0.IsBetweenEE(5.0, 5.1));

        Assert.IsTrue(5.0.IsBetweenII(4.9, 5.1));
        Assert.IsTrue(5.0.IsBetweenEI(4.9, 5.1));
        Assert.IsTrue(5.0.IsBetweenIE(4.9, 5.1));
        Assert.IsTrue(5.0.IsBetweenEE(4.9, 5.1));

        Assert.IsFalse(5.0.IsBetweenII(5.1, 4.9));
        Assert.IsFalse(5.0.IsBetweenEI(5.1, 4.9));
        Assert.IsFalse(5.0.IsBetweenIE(5.1, 4.9));
        Assert.IsFalse(5.0.IsBetweenEE(5.1, 4.9));

    }
}

Ответ 4

Нет, вам придется тестировать каждую конечную точку отдельно.

if ((x > 0) && (x < 10)) {
   // do stuff
}

Или, если вы хотите, чтобы он выглядел более "между", измените порядок аргументов:

if ((0 < x) && (x < 10)) {
   // do stuff
}

Ответ 5

До сих пор, похоже, что ни один из ответов не считал вероятной возможностью, что динамически вы не знаете, какое значение является нижней и верхней границей. В общем случае вы можете создать свой собственный метод IsBetween, который, вероятно, будет выглядеть примерно так:

    public bool IsBetween(double testValue, double bound1, double bound2)
    {
        return (testValue >= Math.Min(bound1,bound2) && testValue <= Math.Max(bound1,bound2));
    }

Ответ 6

В С#/.NET нет встроенной конструкции, но вы можете легко добавить свой собственный метод расширения для этого:

public static class ExtensionsForInt32
{
    public static bool IsBetween (this int val, int low, int high)
    {
           return val > low && val < high;
    }
}

Что можно использовать как:

if (5.IsBetween (0, 10)) { /* Do something */ }

Ответ 7

Общая функция, которая проверяется при компиляции!

public static bool IsBetween<T>(this T item, T start, T end) where T : IComparable
{
    return item.CompareTo(start) >= 0 && item.CompareTo(end) <= 0;
}

Ответ 8

Не было бы так просто, как

0 < 5 && 5 < 10

?

Итак, я полагаю, что если вы хотите, чтобы из него вышла функция, вы можете просто добавить это в класс утилиты:

public static bool Between(int num, int min, int max) {
    return min < num && num < max;
}

Ответ 9

int val_to_check = 5
bool in_range = Enumerable.Range(0, 13).Contains(val_to_check);

Второй параметр - это "счет", а не конец или высокое число.

т.е.

int low_num = 0
int high_num = 12
int val_to_check = 5
bool in_range = Enumerable.Range(low_num , high_num - low_num + 1).Contains(val_to_check);

Проверяет, находится ли значение val_to_check между 0 и 12

Ответ 10

За исключением ответа от @Ed G, все ответы требуют знать, какая граница ниже, а какая - верхняя.

Здесь (довольно неочевидный) способ сделать это, когда вы не знаете, какая именно граница.

  /// <summary>
  /// Method to test if a value is "between" two other values, when the relative magnitude of 
  /// the two other values is not known, i.e., number1 may be larger or smaller than number2. 
  /// The range is considered to be inclusive of the lower value and exclusive of the upper 
  /// value, irrespective of which parameter (number1 or number2) is the lower or upper value. 
  /// This implies that if number1 equals number2 then the result is always false.
  /// 
  /// This was extracted from a larger function that tests if a point is in a polygon:
  /// http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
  /// </summary>
  /// <param name="testValue">value to be tested for being "between" the other two numbers</param>
  /// <param name="number1">one end of the range</param>
  /// <param name="number2">the other end of the range</param>
  /// <returns>true if testValue >= lower of the two numbers and less than upper of the two numbers,
  ///          false otherwise, incl. if number1 == number2</returns>
  private static bool IsInRange(T testValue, T number1, T number2)
  {
     return (testValue <= number1) != (testValue <= number2);
  }

Примечание. Это НЕ общий метод; это псевдокод. Т в приведенном выше методе следует заменить на соответствующий тип "int" или "float" или что-то еще. (Есть способы сделать это родовое, но они достаточно грязные, что не стоит использовать для однострочного метода, по крайней мере, в большинстве ситуаций.)

Ответ 11

Как отметил @Hellfrost, буквально бессмысленно сравнивать число с двумя разными номерами в "одной операции", и я не знаю, что такое оператор С#, который инкапсулирует это.

between = (0 < 5 && 5 < 10);

О самой компактной форме, о которой я могу думать.

Вы можете сделать несколько "плавный" способ наблюдения, используя расширение (хотя, хотя и забавно, я думаю, что это слишком много):

public static bool Between(this int x, int a, int b)
{
    return (a < x) && (x < b);
}

Использование:

int x = 5;
bool b = x.Between(0,10);

Ответ 13

Я не знаю этой функции; в любом случае, если ваше значение без знака, только одна операция означает (val < 11)... Если она подписана, я думаю, что нет атомного способа сделать это, потому что 10 не является степенью 2...

Ответ 14

Что насчет

somenumber = Math.Max(0,Math.Min(10,somenumber));

Ответ 15

Base @Dan J эта версия не волнует максимум/мин, больше похоже на sql:)

public static bool IsBetween(this decimal me, decimal a, decimal b, bool include = true)
{
    var left = Math.Min(a, b);
    var righ = Math.Max(a, b);

    return include
        ? (me >= left && me <= righ)
        : (me > left && me < righ)
    ;
}

Ответ 16

Или, если вы хотите связать значение с интервалом:

public static T EnsureRange<T>(this T value, T min, T max) where T : IComparable<T>
    {
        if (value.CompareTo(min) < 0)
            return min;
        else if (value.CompareTo(max) > 0)
            return max;
        else
            return value;
    }

Это похоже на двухсторонний Math.Min/Max

Ответ 17

И для отрицательных значений:

    Public Function IsBetween(Of T)(item As T, pStart As T, pEnd As T) As Boolean ' https://msdn.microsoft.com/fr-fr/library/bb384936.aspx
    Dim Deb As T = pStart
    Dim Fin As T = pEnd
    If (Comparer(Of T).Default.Compare(pStart, pEnd) > 0) Then Deb = pEnd : Fin = pStart
    Return Comparer(Of T).Default.Compare(item, Deb) >= 0 AndAlso Comparer(Of T).Default.Compare(item, Fin) <= 0
End Function