【问题标题】:Is there a class in C# to handle a couple of INT (range of 2 INT- 1-10)C# 中是否有一个类可以处理几个 INT(范围为 2 个 INT-1-10)
【发布时间】:2012-01-11 22:23:54
【问题描述】:

我对 C# 很陌生,我想知道是否有类或数据结构或处理以下要求的最佳方法... 我需要处理代表一系列数据(例如1-10或5-245)的一对int,我需要一种方法来验证该范围内是否包含Int值... 我相信在 C# 中有一个内置在框架中的类来处理我的要求...... 我需要做的是验证一个 INT(例如 5)是否包含在值范围内,例如(1-10)...

如果我发现没有一个类可以处理它,我正在考虑使用一个包含 2 个数字的 Struct 并制作我自己的 Contain 方法来测试 5 是否包含在 1- 范围内10)

【问题讨论】:

  • 您的用例是什么?您想如何验证数字是否在范围内?如果不是,你想发生什么?

标签: c# .net data-structures types int


【解决方案1】:

如果我发现没有要处理的类 它,我正在考虑使用包含 2 个数字的 Struct 和 制作我自己的 Contain 方法来测试 5 是否包含在范围内 1-10)

这实际上是个好主意,因为 BCL 中没有适用于您的场景的内置类。

【讨论】:

  • 实际上我刚刚找到了 Enumerable.Range(1,100).Contains(x) 但我不确定性能......它是否更好的是具有数百万个 Enumerable 的列表/哈希表。 Range(1,100) 或具有数百万个结构的列表/哈希表和更简单的检查方法??? stackoverflow.com/questions/3188672/…
  • @yamini,是的,很好,但这是一种方法,而不是您所要求的数据结构。
【解决方案2】:

您正在寻找范围类型; .Net 框架不包括一个。

您应该按照您的建议创建一个不可变 (!) Int32Range 结构。
您可能希望实现IEnumerable<int> 以允许用户轻松地循环遍历范围内的数字。

您需要决定每个边界是包含还是排除。
[Start, End) 可能是最明显的选择。
无论您选择什么,都应该在 XML cmets 中清楚地记录它。

【讨论】:

  • 出于兴趣,为什么不可变更可取?
  • 啊,我想我的意思是,为什么是结构(而不​​是结构为什么应该是不可变的)?再次只是出于好奇。
  • @KierenJohnstone:结构应该用于表示简单值的小类型,比如这个。
【解决方案3】:

没有什么能完全满足您的要求。

假设我理解正确,这个类写起来很简单。

class Range
{
    public int Low {get; set;}
    public int High {get; set;}

    public bool InRange(int val) { return val >= Low && val <= High; }
}

Tuple&lt;int,int&gt; 可以让您参与其中,但您必须添加一个扩展方法才能获得额外的行为。缺点是下限和上限隐含为Item1Item2,这可能会造成混淆。

// written off-the-cuff, may not compile
public static class TupleExtension
{
    public static bool InRange(Tuple<int, int> this, int queryFor)
    {
         return this.Item1 >= queryFor && this.Item2 <= queryFor;
    }
}

【讨论】:

    【解决方案4】:

    如果你想避免创建一个新类型,你可以创建一个扩展:

    public static class Extensions
    {
      public static bool IsInRange(this int value, int min, int max)
      {
        return value >= min && value <= max;
      }
    }
    

    然后你可以这样做:

    if(!value.IsInRange(5, 545))
      throw new Exception("Value is out of range.");
    

    【讨论】:

      【解决方案5】:

      我认为您可以使用数组来做到这一点。 一些很好的例子和解释可以在这里找到: http://www.dotnetperls.com/int-array

      【讨论】:

      • 你能详细说明一下吗?使用数组没有非常明显的解决方案
      【解决方案6】:

      AFAIK 中没有内置任何内容,但是(取决于范围的大小) Enumerable.Range 可以工作(但不是最佳的,因为您实际上存储了范围中的每个值,而不仅仅是端点)。不过,它确实允许您使用 LINQ 方法(包括 Enumerable.Contains) - 这可能会派上用场。

      const int START = 5;
      const int END = 245;
      
      var r = Enumerable.Range(START, (END - START)); // 2nd param is # of integers
      return r.Contains(100);
      

      就我个人而言,我可能会继续编写这个类,因为它相当简单(如果你想对其进行 LINQ,你总是可以通过 Enumerable.Range 公开一个 IEnumerable&lt;int&gt; 迭代器)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-12
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 1970-01-01
        • 2015-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多