如果我有两个T类型的变量,是否可以获得两个变量之间的所有值,假设两个T类型相同?
我在.net 2.0中工作,并根据以下代码构建了一个Range类:Intersection of Date Ranges
如果我知道类型是DateTime,很容易循环遍历日期,从Start值到End值。像这样:
List<DateTime> values = new List<DateTime>();
for (DateTime d = myRange.Start; d <= myRange.End; d = d.AddDays(1))
{
values.Add(d);
}
但是,为了使这更通用,有没有办法做任何类型T?
我要求一些不可能的东西吗?
答案 0 :(得分: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没有自然递增函数:例如String。其次,即使有增量函数,也无法找到它。即使您使用DateTimes示例,也无法确定是否需要AddDays(1)
,而不是AddSeconds(1)
。
答案 1 :(得分:1)
我认为这不可能在任何类型T上使用。并非所有表单都具有可排序的值,它们之间具有不同的步骤。 0-10的整数很简单。上面的示例也是如此。
但你怎么从“船”到“卡车”?我不认为它可以很容易地适用于任何形式。
答案 2 :(得分:0)
你试过吗?
你可以这样做但它只适用于可以这种方式进行比较的类型。
答案 3 :(得分:0)
您要求的内容无法通过.net中实现的泛型来完成。最好的办法是定义一个指定所需操作的界面,并将约束应用于T
。
您可以使用C ++模板来实现整数值。使用 duck typing 的语言也是微不足道的。
答案 4 :(得分:0)
鉴于T可能是一个只有一个值的类型,我无法看到如何一般地解决这个问题。如果T支持和接口允许确定其范围,则可能是可能的。