Google не понимает, что "между" - это имя функции, которую я ищу, и ничего не возвращает.
Пример: я хочу проверить, находится ли 5 между 0 и 10 только в одной операции
Google не понимает, что "между" - это имя функции, которую я ищу, и ничего не возвращает.
Пример: я хочу проверить, находится ли 5 между 0 и 10 только в одной операции
Нет, но вы можете написать свой собственный:
public static bool Between(this int num, int lower, int upper, bool inclusive = false)
{
return inclusive
? lower <= num && num <= upper
: lower < num && num < upper;
}
Неясно, что вы подразумеваете под "одной операцией", но нет, нет метода 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
Здесь полный класс.
/// <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));
}
}
Нет, вам придется тестировать каждую конечную точку отдельно.
if ((x > 0) && (x < 10)) {
// do stuff
}
Или, если вы хотите, чтобы он выглядел более "между", измените порядок аргументов:
if ((0 < x) && (x < 10)) {
// do stuff
}
До сих пор, похоже, что ни один из ответов не считал вероятной возможностью, что динамически вы не знаете, какое значение является нижней и верхней границей. В общем случае вы можете создать свой собственный метод IsBetween, который, вероятно, будет выглядеть примерно так:
public bool IsBetween(double testValue, double bound1, double bound2)
{
return (testValue >= Math.Min(bound1,bound2) && testValue <= Math.Max(bound1,bound2));
}
В С#/.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 */ }
Общая функция, которая проверяется при компиляции!
public static bool IsBetween<T>(this T item, T start, T end) where T : IComparable
{
return item.CompareTo(start) >= 0 && item.CompareTo(end) <= 0;
}
Не было бы так просто, как
0 < 5 && 5 < 10
?
Итак, я полагаю, что если вы хотите, чтобы из него вышла функция, вы можете просто добавить это в класс утилиты:
public static bool Between(int num, int min, int max) {
return min < num && num < max;
}
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
За исключением ответа от @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" или что-то еще. (Есть способы сделать это родовое, но они достаточно грязные, что не стоит использовать для однострочного метода, по крайней мере, в большинстве ситуаций.)
Как отметил @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);
Обратитесь к этой ссылке. Однострочное решение этого вопроса.
Как элегантно проверить, находится ли число в пределах диапазона?
int x = 30;
if (Enumerable.Range(1,100).Contains(x))
//true
if (x >= 1 && x <= 100)
//true
Я знаю, что сообщение довольно старое, но оно может помочь другим.
Я не знаю этой функции; в любом случае, если ваше значение без знака, только одна операция означает (val < 11)... Если она подписана, я думаю, что нет атомного способа сделать это, потому что 10 не является степенью 2...
Что насчет
somenumber = Math.Max(0,Math.Min(10,somenumber));
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)
;
}
Или, если вы хотите связать значение с интервалом:
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
И для отрицательных значений:
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