X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.Core%2FSystem.Linq%2FEnumerable.cs;h=d2c98d0a1954f16a877a18c2c856d759747d2563;hb=cc2c56a916645e45991c43f86409966218a6a177;hp=820790a0f4d09df3093f3ff9b0cd82d3988fd268;hpb=99a81c984e4714c162e00f650b582fe1ca7e0bf4;p=mono.git diff --git a/mcs/class/System.Core/System.Linq/Enumerable.cs b/mcs/class/System.Core/System.Linq/Enumerable.cs index 820790a0f4d..d2c98d0a195 100644 --- a/mcs/class/System.Core/System.Linq/Enumerable.cs +++ b/mcs/class/System.Core/System.Linq/Enumerable.cs @@ -854,7 +854,7 @@ namespace System.Linq { var items = new HashSet (second, comparer); foreach (TSource element in first) { - if (items.Contains (element)) + if (items.Remove (element)) yield return element; } } @@ -1052,47 +1052,73 @@ namespace System.Linq { Check.Source (source); - return IterateNullable (source, int.MinValue, (a, b) => a > b); + return IterateNullable (source, (a, b) => Math.Max (a, b)); } public static long? Max (this IEnumerable source) { Check.Source (source); - return IterateNullable (source, long.MinValue, (a, b) => a > b); + return IterateNullable (source, (a, b) => Math.Max (a, b)); } public static double? Max (this IEnumerable source) { Check.Source (source); - return IterateNullable (source, double.MinValue, (a, b) => a > b); + return IterateNullable (source, (a, b) => Math.Max (a, b)); } public static float? Max (this IEnumerable source) { Check.Source (source); - return IterateNullable (source, float.MinValue, (a, b) => a > b); + return IterateNullable (source, (a, b) => Math.Max (a, b)); } public static decimal? Max (this IEnumerable source) { Check.Source (source); - return IterateNullable (source, decimal.MinValue, (a, b) => a > b); + return IterateNullable (source, (a, b) => Math.Max (a, b)); } - static T? IterateNullable (IEnumerable source, T initValue, Func selector) where T : struct + static T? IterateNullable (IEnumerable source, Func 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)) - value = element; + if (!value.HasValue) + value = element.Value; + else + value = selector (element.Value, value.Value); + + empty = false; + } + + if (empty) + return null; + + return value; + } + + static TRet? IterateNullable ( + IEnumerable source, + Func source_selector, + Func 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; } @@ -1184,67 +1210,39 @@ namespace System.Linq return initValue; } - static U? IterateNullable (IEnumerable source, U initialValue, Func 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 (this IEnumerable source, Func 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 (this IEnumerable source, Func 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 (this IEnumerable source, Func 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 (this IEnumerable source, Func 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 (this IEnumerable source, Func 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 (this IEnumerable source, Func 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) => Math.Min (a, b)); } public static long? Min (this IEnumerable source) { Check.Source (source); - return IterateNullable (source, long.MaxValue, (a, b) => a < b); + return IterateNullable (source, (a, b) => Math.Min (a, b)); } public static double? Min (this IEnumerable source) { Check.Source (source); - return IterateNullable (source, double.MaxValue, (a, b) => a < b); + return IterateNullable (source, (a, b) => Math.Min (a, b)); } public static float? Min (this IEnumerable source) { Check.Source (source); - return IterateNullable (source, float.MaxValue, (a, b) => a < b); + return IterateNullable (source, (a, b) => Math.Min (a, b)); } public static decimal? Min (this IEnumerable source) { Check.Source (source); - return IterateNullable (source, decimal.MaxValue, (a, b) => a < b); + return IterateNullable (source, (a, b) => Math.Min (a, b)); } public static TSource Min (this IEnumerable 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 (this IEnumerable source, Func 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 (this IEnumerable source, Func 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 (this IEnumerable source, Func 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 (this IEnumerable source, Func 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 (this IEnumerable source, Func selector)