2011-04-28 125 views
2

如果我有兩個T類型的變量,假設兩個T類型是相同的,是否有可能獲得兩個變量之間的所有值?如何獲得T類型的兩個變量之間的所有值?

我在.NET 2.0工作,並建立了基於此代碼的Range類:Intersection of Date Ranges

如果我知道的類型是DATETIME,很容易通過的日期循環容易從一開始到開始值到最終值。像這樣:

List<DateTime> values = new List<DateTime>(); 

for (DateTime d = myRange.Start; d <= myRange.End; d = d.AddDays(1)) 
{ 
    values.Add(d); 
} 

但是,爲了使這更通用,有沒有辦法做到這一點的任何類型T?

我在問一些不可能的事嗎?

回答

5

你可以用IComparable<T>這樣做。

public static List<T> GetRange(T start, T end, Func<T,T> increment) 
{ 
    List<T> result = new List<T>(); 
    for(T t = start; t.CompareTo(end) < 0; t = increment(t)) 
    { 
     result.Add(t); 
    } 
    return result; 
} 

List<DateTime> values = GetRange<DateTime>(myRange.Start, myRange.End, d => d.AddDays(1)); 

遞增函數需要一對夫婦的原因手動設置:首先,一些IComparables沒有自然增量功能:字符串,例如。其次,即使有增量功能,也無法找到它。即使以您的DateTimes爲例,也無法確定您需要AddDays(1),而不是AddSeconds(1)

+0

這正是我正在尋找的...謝謝。 – Jon 2011-06-03 21:10:19

0

你試過了嗎?

你可以這樣做,但它只適用於可以用這種方式進行比較的類型。

1

我認爲這是不可能在任何類型T上使用的。並不是所有的表單都會有一個可排序的值,它們之間有不同的步驟。 0-10的整數很簡單。上面的例子也是如此。

但你怎麼從「船」到「卡車」?我認爲它不適用於任何形式。

0

你要求的東西不能用.net中實現的泛型來完成。您最好的選擇是定義一個接口來指定您需要的操作並對T應用一個約束。

你可以用C++模板來完成整型值。在使用鴨打字的語言中也是微不足道的。

0

鑑於T可能是一種只有一個值的類型,我看不出如何一般地解決這個問題。如果T支持和接口允許確定範圍,則可能是可能的。

相關問題