From c66260df9089bac6fa88b20707cd7543b1be66fb Mon Sep 17 00:00:00 2001 From: jbevain Date: Wed, 19 May 2010 14:41:12 +0000 Subject: [PATCH] 2010-05-19 Jb Evain * Enumerable.cs: fix GroupBy to deal with a null key for the last group entry. Also fix GroupBy to properly throw ArgumentNullException. git-svn-id: svn+ssh://mono-cvs.ximian.com/source/trunk/mcs@157558 e3ebcda4-bce8-0310-ba0a-eca2169e7518 --- class/System.Core/System.Linq/ChangeLog | 5 +++ class/System.Core/System.Linq/Enumerable.cs | 62 ++++++++++++++++++++++------- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/class/System.Core/System.Linq/ChangeLog b/class/System.Core/System.Linq/ChangeLog index c36b8c425d..8c9d0be82d 100644 --- a/class/System.Core/System.Linq/ChangeLog +++ b/class/System.Core/System.Linq/ChangeLog @@ -1,3 +1,8 @@ +2010-05-19 Jb Evain + + * Enumerable.cs: fix GroupBy to deal with a null key for the last + group entry. Also fix GroupBy to properly throw ArgumentNullException. + 2010-05-05 Jérémie Laval * ParallelEnumerable.cs: Some operators weren't declared diff --git a/class/System.Core/System.Linq/Enumerable.cs b/class/System.Core/System.Linq/Enumerable.cs index 56018f49d7..5a1ae605e4 100644 --- a/class/System.Core/System.Linq/Enumerable.cs +++ b/class/System.Core/System.Linq/Enumerable.cs @@ -891,8 +891,8 @@ namespace System.Linq static IEnumerable> CreateGroupByIterator (this IEnumerable source, Func keySelector, IEqualityComparer comparer) { - Dictionary> groups = new Dictionary> (); - List nullList = new List (); + var groups = new Dictionary> (); + var nullList = new List (); int counter = 0; int nullCounter = -1; @@ -916,14 +916,18 @@ namespace System.Linq } counter = 0; - foreach (KeyValuePair> group in groups) { + foreach (var group in groups) { if (counter == nullCounter) { - Grouping nullGroup = new Grouping (default (TKey), nullList); - yield return nullGroup; + yield return new Grouping (default (TKey), nullList); counter++; } - Grouping grouping = new Grouping (group.Key, group.Value); - yield return grouping; + + yield return new Grouping (group.Key, group.Value); + counter++; + } + + if (counter == nullCounter) { + yield return new Grouping (default (TKey), nullList); counter++; } } @@ -939,8 +943,14 @@ namespace System.Linq { Check.SourceAndKeyElementSelectors (source, keySelector, elementSelector); - Dictionary> groups = new Dictionary> (); - List nullList = new List (); + return CreateGroupByIterator (source, keySelector, elementSelector, comparer); + } + + static IEnumerable> CreateGroupByIterator (this IEnumerable source, + Func keySelector, Func elementSelector, IEqualityComparer comparer) + { + var groups = new Dictionary> (); + var nullList = new List (); int counter = 0; int nullCounter = -1; @@ -965,14 +975,18 @@ namespace System.Linq } counter = 0; - foreach (KeyValuePair> group in groups) { + foreach (var group in groups) { if (counter == nullCounter) { - Grouping nullGroup = new Grouping (default (TKey), nullList); - yield return nullGroup; + yield return new Grouping (default (TKey), nullList); counter++; } - Grouping grouping = new Grouping (group.Key, group.Value); - yield return grouping; + + yield return new Grouping (group.Key, group.Value); + counter++; + } + + if (counter == nullCounter) { + yield return new Grouping (default (TKey), nullList); counter++; } } @@ -989,6 +1003,16 @@ namespace System.Linq Func, TResult> resultSelector, IEqualityComparer comparer) { + Check.GroupBySelectors (source, keySelector, elementSelector, resultSelector); + + return CreateGroupByIterator (source, keySelector, elementSelector, resultSelector, comparer); + } + + static IEnumerable CreateGroupByIterator (this IEnumerable source, + Func keySelector, Func elementSelector, + Func, TResult> resultSelector, + IEqualityComparer comparer) + { IEnumerable> groups = GroupBy ( source, keySelector, elementSelector, comparer); @@ -1008,6 +1032,16 @@ namespace System.Linq Func, TResult> resultSelector, IEqualityComparer comparer) { + Check.SourceAndKeyResultSelectors (source, keySelector, resultSelector); + + return CreateGroupByIterator (source, keySelector, resultSelector, comparer); + } + + static IEnumerable CreateGroupByIterator (this IEnumerable source, + Func keySelector, + Func, TResult> resultSelector, + IEqualityComparer comparer) + { IEnumerable> groups = GroupBy (source, keySelector, comparer); foreach (IGrouping group in groups) -- 2.11.4.GIT