【问题标题】:If value in range(x,y) function c#如果值在 range(x,y) 函数 c#
【发布时间】:2012-01-08 09:47:46
【问题描述】:

c# 是否有返回布尔表达式的函数:if(value.inRange(-1.0,1.0)){}?

【问题讨论】:

  • 包含还是独占? if (value >= 1.0 && value <= 1.0)呢?
  • 这个函数应该操作哪些类型?不可缺少的?漂浮?有课吗?
  • @Mr.TAMER:制作自己的venchile而不是使用标准方式好不好?然后互相检查“这个函数是做什么的”
  • 我有很多论据要检查,并认为 c# 有它的功能。 float 类型的所有值。
  • 为什么首先要把它变成一个方法?它使代码比简单地写出表达式更难阅读,就像@FrédéricHamidi 所做的那样。如果使用诸如 InRange 之类的模棱两可的方法名称,这尤其糟糕。

标签: c# range


【解决方案1】:

说明

我建议你使用扩展方法。

扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

您可以以通用方式创建此扩展方法(感谢 digEmAll 和 CodeInChaos,他们建议这样做)。然后你可以在每个实现IComparable的对象上使用它。

解决方案

public static class IComparableExtension
{
    public static bool InRange<T>(this T value, T from, T to) where T : IComparable<T>
    {
        return value.CompareTo(from) >= 1 && value.CompareTo(to) <= -1;
    }
}

然后你这样做

double t = 0.5;
bool isInRange = t.InRange(-1.0, 1.0);

完美主义者更新

经过与@CodeInChaos 的广泛讨论,他说

我可能会按照之前评论中的建议使用 IsInOpenInterval。但我不确定没有数学背景的程序员是否会理解这个术语。

您也可以将函数命名为IsInOpenInterval。

更多信息

【讨论】:

  • 至少遵守 .NET 命名约定并将其命名为 InRange。
  • 好吧。谢谢,这个适合我。
  • 你可以让这个更通用,将double更改为IComparable&lt;T&gt;,然后使用CompareTo而不是&lt;&gt;
  • 非常棒的新更改,您现在将值装箱,并且您失去了所有类型安全性。我认为@digEmAll 的意思是使用签名bool InRange&lt;T&gt;(T value, T from, T to) where T:IComperable&lt;T&gt;。
  • @dknaack:我的建议与@CodeInChaos 所说的完全一致。而且,顺便说一句,您不应该使用== 1 和== -1,因为CompareTo 不保证返回这些数字,而是返回一个数字less than 0、equal to 0 或greater than 0。 --> LINK
【解决方案2】:

以Math.Abs(value) &lt;= 1.0 为例

【讨论】:

    【解决方案3】:

    不是很清楚,但可能是相反的:

    Enumerable. Range(-1, 2).Any(x=&gt;x==value).

    顺便说一句没编译,手机写的。

    编辑

    我在这里使用Enumerable.Range

    编辑1

    如果我们谈论的是floating point 数字,那么创建一个extension method 就足够了,它通过指定start number 和offset step 来生成数字序列,然后在结果集合上执行Any&lt;T&gt;,就像在提供的aswer 中一样.

    【讨论】:

    • 这仅适用于int,但我需要float。
    • @wsevendsys: 那么(-1.0, 1.0)的数字顺序是什么?
    • 我想你没有得到这个问题。他想测试一个浮点数是否在一个区间内。即类似lower&lt;=value&lt;=upper。他不想创建序列。
    • @CodeInChaos:但为什么在回答 jdehaan 的评论中他写道:“如何传递许多论点?”.. 呸.. 和平。
    • 我认为他想对许多值进行测试,但并不清楚他想要什么。
    猜你喜欢
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2018-06-09
    • 2021-05-22
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多