Math.Min&Math.Max等同于date?

在两个date之间获得最小(或最大)值的最快和最简单的方法是什么? 是否有相当于Math.Min(&Math.Max)date?

我想做一些事情:

if (Math.Min(Date1, Date2) < MINIMUM_ALLOWED_DATE) { //not allowed to do this } 

上面的Math.Min显然不起作用,因为它们是date。

DateTime值不存在重载,但是可以获取值所包含的长值Ticks ,并将它们进行比较,然后从结果中创build一个新的DateTime值:

 new DateTime(Math.Min(Date1.Ticks, Date2.Ticks)) 

(注意,DateTime结构也包含一个Kind属性,这个属性并不保留在新值中,这通常不是一个问题;如果比较不同types的DateTime值,那么比较没有任何意义。

没有内置的方法来做到这一点。 你可以使用expression式:

 (date1 > date2 ? date1 : date2) 

find两者的最大值。

您可以编写一个通用方法来计算任何types的MinMax (前提是Comparer<T>.Default已适当设置):

 public static T Max<T>(T first, T second) { if (Comparer<T>.Default.Compare(first, second) > 0) return first; return second; } 

你也可以使用LINQ:

 new[]{date1, date2, date3}.Max() 

怎么样:

 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中,另一个select是:

 var min = new[] {x,y,z}.Min(); 
 public static class DateTool { public static DateTime Min(DateTime x, DateTime y) { return (x.ToUniversalTime() < y.ToUniversalTime()) ? x : y; } public static DateTime Max(DateTime x, DateTime y) { return (x.ToUniversalTime() > y.ToUniversalTime()) ? x : y; } } 

这允许date具有不同的“种类”,并返回传入的实例(不返回由Ticks或Milliseconds构造的新DateTime)。

 [TestMethod()] public void MinTest2() { DateTime x = new DateTime(2001, 1, 1, 1, 1, 2, DateTimeKind.Utc); DateTime y = new DateTime(2001, 1, 1, 1, 1, 1, DateTimeKind.Local); //Presumes Local TimeZone adjustment to UTC > 0 DateTime actual = DateTool.Min(x, y); Assert.AreEqual(x, actual); } 

请注意,这个testing将失败的格林威治东…

如果你想把它叫做Math.Max,你可以像这样做很短的expression体:

 public static DateTime Max(params DateTime[] dates) => dates.Max(); [...] var lastUpdatedTime = DateMath.Max(feedItemDateTime, assemblyUpdatedDateTime); 

Linq.Min() / Linq.Max()方法:

 DateTime date1 = new DateTime(2000,1,1); DateTime date2 = new DateTime(2001,1,1); DateTime minresult = new[] { date1,date2 }.Min(); DateTime maxresult = new[] { date1,date2 }.Max(); 
 // 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/