是否有C#类型表示整数范围?

Jam*_*ney 102 c#

我需要存储一个整数范围.C#4.0中是否存在现有类型?

当然,我可以使用int Fromint To属性编写自己的类,并构建适当的逻辑来确保这一点From <= To.但是如果一种类型已经存在,我当然宁愿使用它.

drh*_*ris 132

我觉得最好自己动手.有些人使用Tuples或Points,但最终你想要Range扩展并提供一些与a相关的方便方法Range.它也是最好的通用(如果你需要一系列的Doubles,或一些自定义类的范围?)例如:

/// <summary>The Range class.</summary>
/// <typeparam name="T">Generic parameter.</typeparam>
public class Range<T> where T : IComparable<T>
{
    /// <summary>Minimum value of the range.</summary>
    public T Minimum { get; set; }

    /// <summary>Maximum value of the range.</summary>
    public T Maximum { get; set; }

    /// <summary>Presents the Range in readable format.</summary>
    /// <returns>String representation of the Range</returns>
    public override string ToString()
    {
        return string.Format("[{0} - {1}]", this.Minimum, this.Maximum);
    }

    /// <summary>Determines if the range is valid.</summary>
    /// <returns>True if range is valid, else false</returns>
    public bool IsValid()
    {
        return this.Minimum.CompareTo(this.Maximum) <= 0;
    }

    /// <summary>Determines if the provided value is inside the range.</summary>
    /// <param name="value">The value to test</param>
    /// <returns>True if the value is inside Range, else false</returns>
    public bool ContainsValue(T value)
    {
        return (this.Minimum.CompareTo(value) <= 0) && (value.CompareTo(this.Maximum) <= 0);
    }

    /// <summary>Determines if this Range is inside the bounds of another range.</summary>
    /// <param name="Range">The parent range to test on</param>
    /// <returns>True if range is inclusive, else false</returns>
    public bool IsInsideRange(Range<T> range)
    {
        return this.IsValid() && range.IsValid() && range.ContainsValue(this.Minimum) && range.ContainsValue(this.Maximum);
    }

    /// <summary>Determines if another range is inside the bounds of this range.</summary>
    /// <param name="Range">The child range to test</param>
    /// <returns>True if range is inside, else false</returns>
    public bool ContainsRange(Range<T> range)
    {
        return this.IsValid() && range.IsValid() && this.ContainsValue(range.Minimum) && this.ContainsValue(range.Maximum);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 事实证明我是这样做的:http://stackoverflow.com/questions/5101378/problem-comparing-items-implementing-icomparable/5101400#5101400 (14认同)
  • 当时,我不确定`IComparable`会保证操作员过载.我保证`CompareTo`方法,因此使用. (13认同)
  • 非常有帮助,谢谢!为什么不添加一个允许您立即初始化它的构造函数?`public Range(T min,T max){Minimum = min; 最大=最大; }` (6认同)
  • 可能更好`struct`而不是`class`? (2认同)
  • @Will嘿,男人不要敲打准系统文件的智慧.:) (2认同)

And*_*ius 8

我写的一个小班可能对某人有帮助:

    public class Range
    {
        public static List<int> range(int a, int b)
        {
            List<int> result = new List<int>();

            for(int i = a; i <= b; i++)
            {
                result.Add(i);
            }

            return result;
        }

        public static int[] Understand(string input)
        {
            return understand(input).ToArray();
        }

        public static List<int> understand(string input)
        {
            List<int> result = new List<int>();
            string[] lines = input.Split(new char[] {';', ','});

            foreach (string line in lines)
            {
                try
                {
                    int temp = Int32.Parse(line);
                    result.Add(temp);
                }
                catch
                {
                    string[] temp = line.Split(new char[] { '-' });
                    int a = Int32.Parse(temp[0]);
                    int b = Int32.Parse(temp[1]);
                    result.AddRange(range(a, b).AsEnumerable());
                }
            }

            return result;
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后你打电话:

Range.understand("1,5-9,14;16,17;20-24")
Run Code Online (Sandbox Code Playgroud)

结果如下:

List<int>
    [0]: 1
    [1]: 5
    [2]: 6
    [3]: 7
    [4]: 8
    [5]: 9
    [6]: 14
    [7]: 16
    [8]: 17
    [9]: 20
    [10]: 21
    [11]: 22
    [12]: 23
    [13]: 24
Run Code Online (Sandbox Code Playgroud)

  • 我真的很喜欢理解功能 (4认同)

Tom*_*ugh 6

范围和索引随C#8.0一起发布。

您现在可以做

string[] names =
{
    "Archimedes", "Pythagoras", "Euclid", "Socrates", "Plato"
};
foreach (var name in names[1..4])
{
    yield return name;
}
Run Code Online (Sandbox Code Playgroud)

查看https://blogs.msdn.microsoft.com/dotnet/2018/12/05/take-c-8-0-for-a-spin/了解更多详细信息。

  • 这是一个不同的概念,并不符合OP的要求。 (2认同)