2012-04-16 46 views
5

我們有很多有「分」和之類的東西的價格,利潤,費用等,目前這些都爲兩個參數傳遞給方法,往往有不同的屬性/方法來檢索他們「最大」值的代碼。有沒有一個標準的類來代表.net中的「範圍」?

我已經看到了101的自定義類存儲在不同的代碼基礎值的範圍在過去的幾十年裏,在我創造又一個這樣的課,我想確認.NET框架,這些天沒有這樣的建在某處的類。

(我知道如何在需要時創建自己的類,但我們有太多的車輪在這個世界上已經是我剛剛發明心血來潮花葯一個)

回答

5

這是正確的,沒有內置 - 在C#中的類或範圍的BCL。但是,BCL中有TimeSpan表示時間跨度,您可以使用DateTime來表示時間範圍。

+1

爲什麼這個downvoted? – jason 2012-04-18 11:35:59

+0

對此的看法令我困惑。 – jason 2012-04-29 02:36:54

+0

我得到了兩個無法解釋的downvotes。非常煩人。我從+1得到補償。 – Steven 2013-02-11 10:36:15

6

AFAIK沒有在.NET中沒有這樣的事情。有趣的是,想出一個通用的實現。

構建一個通用的BCL質量範圍類型是大量的工作,但它可能是這個樣子:

public enum RangeBoundaryType 
{ 
    Inclusive = 0, 
    Exclusive 
} 

public struct Range<T> : IComparable<Range<T>>, IEquatable<Range<T>> 
    where T : struct, IComparable<T> 
{ 
    public Range(T min, T max) : 
     this(min, RangeBoundaryType.Inclusive, 
      max, RangeBoundaryType.Inclusive) 
    { 
    } 

    public Range(T min, RangeBoundaryType minBoundary, 
     T max, RangeBoundaryType maxBoundary) 
    { 
     this.Min = min; 
     this.Max = max; 
     this.MinBoundary = minBoundary; 
     this.MaxBoundary = maxBoundary; 
    } 

    public T Min { get; private set; } 
    public T Max { get; private set; } 
    public RangeBoundaryType MinBoundary { get; private set; } 
    public RangeBoundaryType MaxBoundary { get; private set; } 

    public bool Contains(Range<T> other) 
    { 
     // TODO 
    } 

    public bool OverlapsWith(Range<T> other) 
    { 
     // TODO 
    } 

    public override string ToString() 
    { 
     return string.Format("Min: {0} {1}, Max: {2} {3}", 
      this.Min, this.MinBoundary, this.Max, this.MaxBoundary); 
    } 

    public override int GetHashCode() 
    { 
     return this.Min.GetHashCode() << 256^this.Max.GetHashCode(); 
    } 

    public bool Equals(Range<T> other) 
    { 
     return 
      this.Min.CompareTo(other.Min) == 0 && 
      this.Max.CompareTo(other.Max) == 0 && 
      this.MinBoundary == other.MinBoundary && 
      this.MaxBoundary == other.MaxBoundary; 
    } 

    public static bool operator ==(Range<T> left, Range<T> right) 
    { 
     return left.Equals(right); 
    } 

    public static bool operator !=(Range<T> left, Range<T> right) 
    { 
     return !left.Equals(right); 
    } 

    public int CompareTo(Range<T> other) 
    { 
     if (this.Min.CompareTo(other.Min) != 0) 
     { 
      return this.Min.CompareTo(other.Min); 
     } 

     if (this.Max.CompareTo(other.Max) != 0) 
     { 
      this.Max.CompareTo(other.Max); 
     } 

     if (this.MinBoundary != other.MinBoundary) 
     { 
      return this.MinBoundary.CompareTo(other.Min); 
     } 

     if (this.MaxBoundary != other.MaxBoundary) 
     { 
      return this.MaxBoundary.CompareTo(other.MaxBoundary); 
     } 

     return 0; 
    } 
} 
+0

downvoters請解釋他們downvote? – Steven 2012-04-18 18:12:28

+0

嗯,我沒有低估你,但我不喜歡在這裏,是強制T是結構?爲什麼這樣的約束?另一件事是範圍本身不應該是結構。當它比指針佔用更少的內存時結構很好(然後效率很高 - 複製)。這個類顯然需要超過4或8個字節。 – dzendras 2012-05-12 00:49:27

+0

@dzendras:我同意你的意見。這個想法是給出類型值類型的語義,所以我選擇了'struct',但這不一定是。請注意,框架設計準則建議值類型要小於16個字節,因此不能是8或4,但範圍可以很容易變爲16個字節或更大,例如使用「範圍」時。 – Steven 2012-05-12 01:40:30

1

我已經開始做我自己。

public class Range<T> where T : IComparable 
{ 
    private readonly T start; 

    private readonly T end; 

    public Range(T start, T end) 
    { 
     if (start.CompareTo(end) < 0) 
     { 
      this.start = start; 
      this.end = end; 
     } 
     else 
     { 
      this.start = end; 
      this.end = start; 
     } 
    } 

    public T Start 
    { 
     get 
     { 
      return this.start; 
     } 
    } 

    public T End 
    { 
     get 
     { 
      return this.end; 
     } 
    } 

    public static bool Intersect(Range<T> a, Range<T> b) 
    { 
     return !(b.Start.CompareTo(a.End) > 0 || a.Start.CompareTo(b.End) > 0); 
    } 

    public bool Intersect(Range<T> other) 
    { 
     return Intersect(this, other); 
    } 
} 
相關問題