Data Types C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Schedule.Utils
{
    public class AvailibleDoubleRange 
    {
        private double _start;
        private double _end;
        public double Start { get { return _start;  } internal set { _start = value; } }
        public double End { get { return _end; } internal set { _end = value; } }
        public AvailibleDoubleRange(double start, double end)
        {
            _start = start;
            _end = end;
            AvailibleRange = new DoubleRange[] { new DoubleRange() { Start = start, End = end } };
        }
        public DoubleRange[] AvailibleRange { get; private set; }
        public void SubtractRange(Double start, Double end)
        {
            List newRanges = new List(AvailibleRange);
            
            for (int i = newRanges.Count - 1; i >= 0; i--)
            {
                if (start <= newRanges[i].Start && end >= newRanges[i].End)
                {
                    // subtract range is larger then item, remove the item
                    newRanges.RemoveAt(i);
                }
                else if (start == newRanges[i].Start)
                {
                    // if the range start is equal to the start of the other item, adjust start
                    newRanges[i] = new DoubleRange(end, newRanges[i].End);
                }
                else if (end == newRanges[i].End)
                {
                    // if the range end is equal to the start of the other item, adjust end
                    newRanges[i] = new DoubleRange(newRanges[i].Start, start);
                }
                else if (start > newRanges[i].Start && end < newRanges[i].End)
                {
                    // split the ranges
                    DoubleRange leftRange = new DoubleRange(){ Start = newRanges[i].Start, End = start};
                    DoubleRange rightRange = new DoubleRange() { Start = end, End = newRanges[i].End };
                    newRanges.RemoveAt(i);
                    newRanges.Add(leftRange);
                    newRanges.Add(rightRange);
                }
            }
            AvailibleRange = newRanges.ToArray();
        }
        public void AddRange(DoubleRange range)
        {
            throw new NotSupportedException();
        }
        internal AvailibleDoubleRange Clone()
        {
            AvailibleDoubleRange copy = new AvailibleDoubleRange(this.Start, this.End);
            copy.AvailibleRange = this.AvailibleRange.Clone() as DoubleRange[];
            return copy;
        }
    }
    public struct DoubleRange
    {
        private double _start;
        private double _end;
        public DoubleRange(double start, double end)
        {
            _start = start;
            _end = end;
        }
        public double Start { get { return _start; } internal set { _start = value; } }
        public double End { get { return _end; } internal set { _end = value; } }
    }
}