diff options
author | Jb Evain <jbevain@gmail.com> | 2009-02-23 21:12:55 +0300 |
---|---|---|
committer | Jb Evain <jbevain@gmail.com> | 2009-02-23 21:12:55 +0300 |
commit | 5333294da502712b81754126a86138c9fb489491 (patch) | |
tree | 968bef50308eca4465255718a52100d432e7d253 /mcs/class/System.Core/System.Linq/Enumerable.cs | |
parent | aa5fd91f641c6748da0126d27f824699030e2a8b (diff) |
2009-02-23 Jb Evain <jbevain@novell.com>
* Enumerable.cs (IterateNullable): fix initial value
for nullables.
svn path=/trunk/mcs/; revision=127772
Diffstat (limited to 'mcs/class/System.Core/System.Linq/Enumerable.cs')
-rw-r--r-- | mcs/class/System.Core/System.Linq/Enumerable.cs | 110 |
1 files changed, 49 insertions, 61 deletions
diff --git a/mcs/class/System.Core/System.Linq/Enumerable.cs b/mcs/class/System.Core/System.Linq/Enumerable.cs index 820790a0f4d..074d4480cbf 100644 --- a/mcs/class/System.Core/System.Linq/Enumerable.cs +++ b/mcs/class/System.Core/System.Linq/Enumerable.cs @@ -1052,46 +1052,48 @@ namespace System.Linq { Check.Source (source); - return IterateNullable (source, int.MinValue, (a, b) => a > b); + return IterateNullable (source, (a, b) => a > b); } public static long? Max (this IEnumerable<long?> source) { Check.Source (source); - return IterateNullable (source, long.MinValue, (a, b) => a > b); + return IterateNullable (source, (a, b) => a > b); } public static double? Max (this IEnumerable<double?> source) { Check.Source (source); - return IterateNullable (source, double.MinValue, (a, b) => a > b); + return IterateNullable (source, (a, b) => a > b); } public static float? Max (this IEnumerable<float?> source) { Check.Source (source); - return IterateNullable (source, float.MinValue, (a, b) => a > b); + return IterateNullable (source, (a, b) => a > b); } public static decimal? Max (this IEnumerable<decimal?> source) { Check.Source (source); - return IterateNullable (source, decimal.MinValue, (a, b) => a > b); + return IterateNullable (source, (a, b) => a > b); } - static T? IterateNullable<T> (IEnumerable<T?> source, T initValue, Func<T?, T?, bool> selector) where T : struct + static T? IterateNullable<T> (IEnumerable<T?> source, Func<T?, T?, bool> selector) where T : struct { bool empty = true; - T? value = initValue; + T? value = null; foreach (var element in source) { if (!element.HasValue) continue; - if (selector (element.Value, value)) + if (!value.HasValue) + value = element.Value; + else if (selector (element.Value, value)) value = element; empty = false; @@ -1103,6 +1105,30 @@ namespace System.Linq return value; } + static TRet? IterateNullable<TSource, TRet> ( + IEnumerable<TSource> source, + Func<TSource, TRet?> source_selector, + Func<TRet?, TRet?, bool> selector) where TRet : struct + { + bool empty = true; + TRet? value = null; + foreach (var element in source) { + TRet? item = source_selector (element); + + if (!value.HasValue) + value = item; + else if (selector (item, value)) + value = item; + + empty = false; + } + + if (empty) + return null; + + return value; + } + public static TSource Max<TSource> (this IEnumerable<TSource> source) { Check.Source (source); @@ -1184,67 +1210,39 @@ namespace System.Linq return initValue; } - static U? IterateNullable<T, U> (IEnumerable<T> source, U initialValue, Func<T, U?, U?> selector) where U : struct - { - bool empty = true; - U? value = initialValue; - foreach (var element in source) { - value = selector (element, value); - if (!value.HasValue) - continue; - - empty = false; - } - - if (empty) - return null; - - return value; - } - public static int? Max<TSource> (this IEnumerable<TSource> source, Func<TSource, int?> selector) { Check.SourceAndSelector (source, selector); - return IterateNullable (source, int.MinValue, (a, b) => { - var v = selector (a); return v > b ? v : b; - }); + return IterateNullable (source, selector, (a, b) => a > b); } public static long? Max<TSource> (this IEnumerable<TSource> source, Func<TSource, long?> selector) { Check.SourceAndSelector (source, selector); - return IterateNullable (source, long.MinValue, (a, b) => { - var v = selector (a); return v > b ? v : b; - }); + return IterateNullable (source, selector, (a, b) => a > b); } public static double? Max<TSource> (this IEnumerable<TSource> source, Func<TSource, double?> selector) { Check.SourceAndSelector (source, selector); - return IterateNullable (source, double.MinValue, (a, b) => { - var v = selector (a); return v > b ? v : b; - }); + return IterateNullable (source, selector, (a, b) => a > b); } public static float? Max<TSource> (this IEnumerable<TSource> source, Func<TSource, float?> selector) { Check.SourceAndSelector (source, selector); - return IterateNullable (source, float.MinValue, (a, b) => { - var v = selector (a); return v > b ? v : b; - }); + return IterateNullable (source, selector, (a, b) => a > b); } public static decimal? Max<TSource> (this IEnumerable<TSource> source, Func<TSource, decimal?> selector) { Check.SourceAndSelector (source, selector); - return IterateNullable (source, decimal.MinValue, (a, b) => { - var v = selector (a); return v > b ? v : b; - }); + return IterateNullable (source, selector, (a, b) => a > b); } public static TResult Max<TSource, TResult> (this IEnumerable<TSource> source, Func<TSource, TResult> selector) @@ -1323,35 +1321,35 @@ namespace System.Linq { Check.Source (source); - return IterateNullable (source, int.MaxValue, (a, b) => a < b); + return IterateNullable (source, (a, b) => a < b); } public static long? Min (this IEnumerable<long?> source) { Check.Source (source); - return IterateNullable (source, long.MaxValue, (a, b) => a < b); + return IterateNullable (source, (a, b) => a < b); } public static double? Min (this IEnumerable<double?> source) { Check.Source (source); - return IterateNullable (source, double.MaxValue, (a, b) => a < b); + return IterateNullable (source, (a, b) => a < b); } public static float? Min (this IEnumerable<float?> source) { Check.Source (source); - return IterateNullable (source, float.MaxValue, (a, b) => a < b); + return IterateNullable (source, (a, b) => a < b); } public static decimal? Min (this IEnumerable<decimal?> source) { Check.Source (source); - return IterateNullable (source, decimal.MaxValue, (a, b) => a < b); + return IterateNullable (source, (a, b) => a < b); } public static TSource Min<TSource> (this IEnumerable<TSource> source) @@ -1425,45 +1423,35 @@ namespace System.Linq { Check.SourceAndSelector (source, selector); - return IterateNullable (source, int.MaxValue, (a, b) => { - var v = selector (a); return v < b ? v : b; - }); + return IterateNullable (source, selector, (a, b) => a < b); } public static long? Min<TSource> (this IEnumerable<TSource> source, Func<TSource, long?> selector) { Check.SourceAndSelector (source, selector); - return IterateNullable (source, long.MaxValue, (a, b) => { - var v = selector (a); return v < b ? v : b; - }); + return IterateNullable (source, selector, (a, b) => a < b); } public static float? Min<TSource> (this IEnumerable<TSource> source, Func<TSource, float?> selector) { Check.SourceAndSelector (source, selector); - return IterateNullable (source, float.MaxValue, (a, b) => { - var v = selector (a); return v < b ? v : b; - }); + return IterateNullable (source, selector, (a, b) => a < b); } public static double? Min<TSource> (this IEnumerable<TSource> source, Func<TSource, double?> selector) { Check.SourceAndSelector (source, selector); - return IterateNullable (source, double.MaxValue, (a, b) => { - var v = selector (a); return v < b ? v : b; - }); + return IterateNullable (source, selector, (a, b) => a < b); } public static decimal? Min<TSource> (this IEnumerable<TSource> source, Func<TSource, decimal?> selector) { Check.SourceAndSelector (source, selector); - return IterateNullable (source, decimal.MaxValue, (a, b) => { - var v = selector (a); return v < b ? v : b; - }); + return IterateNullable (source, selector, (a, b) => a < b); } public static TResult Min<TSource, TResult> (this IEnumerable<TSource> source, Func<TSource, TResult> selector) |