使用LINQ将DateTime?[]中的null替换为DateTime.MaxValue

时间:2013-05-28 13:24:55

标签: c# linq datetime replace nullable

如何使用DateTime?替换日期为null的所有DateTime.MaxValue

我试过了:

Array.ConvertAll(myDateTimeArray, a => a = a.HasValue ? a : DateTime.MaxValue);

还有:

myDateTimeArray.Where(a => a == null).ToList().ForEach(a => a = DateTime.MaxValue);

之后我想做类似的事情:

DateTime minDate = myDateTimeArray.Min(a => a.Value);

但我收到了InvalidOperationException,因为a.Valuenull ...

3 个答案:

答案 0 :(得分:7)

你可以这样做:

myDateTimeArray = myDateTimeArray.Select(dt => dt ?? DateTime.MaxValue).ToArray();

这将替换整个数组,而不是其各个元素。如果您需要替换单个元素,请改为使用for循环。

答案 1 :(得分:3)

使用Enumerable.Select将日期投影到新数组中:

var newArray = myDateTimeArray.Select(x => x ?? DateTime.MaxValue).ToArray();

null-coalescing operator??)返回左侧操作数(如果它不为空),否则返回右操作数。

答案 2 :(得分:0)

Enumerable.Min Method没有带有DateTime(或DateTime?)值集合的重载。您可以使用Enumerable.Aggregate Method来实现自己的Min方法:

DateTime? result = myDateTimeArray.Where(x => x != null)
                                  .DefaultIfEmpty(null)
                                  .Aggregate((x, y) => x < y ? x : y);

如果null为空,或myDateTimeArray中的所有元素均为myDateTimeArray,或null中的最小DateTime值,则会返回myDateTimeArray