获得两个日期之间的最小值(或最大值)的最快和最简单的方法是什么?有数学等价物吗?Min (& Math.Max)的日期?
我想做的事情是:
if (Math.Min(Date1, Date2) < MINIMUM_ALLOWED_DATE) {
//not allowed to do this
}
显然上面的数学。Min没用,因为它们是日期。
获得两个日期之间的最小值(或最大值)的最快和最简单的方法是什么?有数学等价物吗?Min (& Math.Max)的日期?
我想做的事情是:
if (Math.Min(Date1, Date2) < MINIMUM_ALLOWED_DATE) {
//not allowed to do this
}
显然上面的数学。Min没用,因为它们是日期。
当前回答
如何:
public static T Min<T>(params T[] values)
{
if (values == null) throw new ArgumentNullException("values");
var comparer = Comparer<T>.Default;
switch(values.Length) {
case 0: throw new ArgumentException();
case 1: return values[0];
case 2: return comparer.Compare(values[0],values[1]) < 0
? values[0] : values[1];
default:
T best = values[0];
for (int i = 1; i < values.Length; i++)
{
if (comparer.Compare(values[i], best) < 0)
{
best = values[i];
}
}
return best;
}
}
// overload for the common "2" case...
public static T Min<T>(T x, T y)
{
return Comparer<T>.Default.Compare(x, y) < 0 ? x : y;
}
适用于支持IComparable<T>或IComparable的任何类型。
实际上,使用LINQ,另一种选择是:
var min = new[] {x,y,z}.Min();
其他回答
DateTime扩展方法怎么样?
public static DateTime MaxOf(this DateTime instance, DateTime dateTime)
{
return instance > dateTime ? instance : dateTime;
}
用法:
var maxDate = date1.MaxOf(date2);
// Two different dates
var date1 = new Date(2013, 05, 13);
var date2 = new Date(2013, 04, 10) ;
// convert both dates in milliseconds and use Math.min function
var minDate = Math.min(date1.valueOf(), date2.valueOf());
// convert minDate to Date
var date = new Date(minDate);
http://jsfiddle.net/5CR37/
DateTime值没有重载,但是你可以得到长值Ticks,这是值所包含的,比较它们,然后从结果中创建一个新的DateTime值:
new DateTime(Math.Min(Date1.Ticks, Date2.Ticks))
(请注意,DateTime结构还包含一个Kind属性,它不会保留在新值中。这通常不是问题;如果你比较不同类型的DateTime值,这种比较是没有意义的。)
将这两个方法放在一个Utility类中,并使用它们来获取任意数量的DateTimes的最小/最大值:
public static DateTime Min(params DateTime[] dates)
{
if (dates.Length == 1) return dates[0];
long minTicks = dates[0].Ticks;
for (int i = 1; i < dates.Length; i++)
{
minTicks = Math.Min(minTicks, dates[i].Ticks);
}
return new DateTime(minTicks);
}
public static DateTime Max(params DateTime[] dates)
{
if (dates.Length == 1) return dates[0];
long maxTicks = dates[0].Ticks;
for (int i = 1; i < dates.Length; i++)
{
maxTicks = Math.Max(maxTicks, dates[i].Ticks);
}
return new DateTime(maxTicks);
}
如何:
public static T Min<T>(params T[] values)
{
if (values == null) throw new ArgumentNullException("values");
var comparer = Comparer<T>.Default;
switch(values.Length) {
case 0: throw new ArgumentException();
case 1: return values[0];
case 2: return comparer.Compare(values[0],values[1]) < 0
? values[0] : values[1];
default:
T best = values[0];
for (int i = 1; i < values.Length; i++)
{
if (comparer.Compare(values[i], best) < 0)
{
best = values[i];
}
}
return best;
}
}
// overload for the common "2" case...
public static T Min<T>(T x, T y)
{
return Comparer<T>.Default.Compare(x, y) < 0 ? x : y;
}
适用于支持IComparable<T>或IComparable的任何类型。
实际上,使用LINQ,另一种选择是:
var min = new[] {x,y,z}.Min();