diff options
author | Jb Evain <jbevain@gmail.com> | 2010-05-19 18:43:06 +0400 |
---|---|---|
committer | Jb Evain <jbevain@gmail.com> | 2010-05-19 18:43:06 +0400 |
commit | 41791d06aee1e8d7b9a04eee51d1622640e4523b (patch) | |
tree | 744a8707177768ed15cbecd002ff9bee3fd779ad /mcs/class/System.Core/System.Linq/Enumerable.cs | |
parent | 7fafeb5b281b8566b2e0afb0596b28b538cebfa3 (diff) |
2010-05-19 Jb Evain <jbevain@novell.com>
* Enumerable.cs: fix GroupBy to deal with a null key for the last
group entry. Also fix GroupBy to properly throw ArgumentNullException.
svn path=/branches/mono-2-6/mcs/; revision=157561
Diffstat (limited to 'mcs/class/System.Core/System.Linq/Enumerable.cs')
-rw-r--r-- | mcs/class/System.Core/System.Linq/Enumerable.cs | 62 |
1 files changed, 48 insertions, 14 deletions
diff --git a/mcs/class/System.Core/System.Linq/Enumerable.cs b/mcs/class/System.Core/System.Linq/Enumerable.cs index 083113a9e57..15b52670b08 100644 --- a/mcs/class/System.Core/System.Linq/Enumerable.cs +++ b/mcs/class/System.Core/System.Linq/Enumerable.cs @@ -664,8 +664,8 @@ namespace System.Linq static IEnumerable<IGrouping<TKey, TSource>> CreateGroupByIterator<TSource, TKey> (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer) { - Dictionary<TKey, List<TSource>> groups = new Dictionary<TKey, List<TSource>> (); - List<TSource> nullList = new List<TSource> (); + var groups = new Dictionary<TKey, List<TSource>> (); + var nullList = new List<TSource> (); int counter = 0; int nullCounter = -1; @@ -689,14 +689,18 @@ namespace System.Linq } counter = 0; - foreach (KeyValuePair<TKey, List<TSource>> group in groups) { + foreach (var group in groups) { if (counter == nullCounter) { - Grouping<TKey, TSource> nullGroup = new Grouping<TKey, TSource> (default (TKey), nullList); - yield return nullGroup; + yield return new Grouping<TKey, TSource> (default (TKey), nullList); counter++; } - Grouping<TKey, TSource> grouping = new Grouping<TKey, TSource> (group.Key, group.Value); - yield return grouping; + + yield return new Grouping<TKey, TSource> (group.Key, group.Value); + counter++; + } + + if (counter == nullCounter) { + yield return new Grouping<TKey, TSource> (default (TKey), nullList); counter++; } } @@ -712,8 +716,14 @@ namespace System.Linq { Check.SourceAndKeyElementSelectors (source, keySelector, elementSelector); - Dictionary<TKey, List<TElement>> groups = new Dictionary<TKey, List<TElement>> (); - List<TElement> nullList = new List<TElement> (); + return CreateGroupByIterator (source, keySelector, elementSelector, comparer); + } + + static IEnumerable<IGrouping<TKey, TElement>> CreateGroupByIterator<TSource, TKey, TElement> (this IEnumerable<TSource> source, + Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer) + { + var groups = new Dictionary<TKey, List<TElement>> (); + var nullList = new List<TElement> (); int counter = 0; int nullCounter = -1; @@ -738,14 +748,18 @@ namespace System.Linq } counter = 0; - foreach (KeyValuePair<TKey, List<TElement>> group in groups) { + foreach (var group in groups) { if (counter == nullCounter) { - Grouping<TKey, TElement> nullGroup = new Grouping<TKey, TElement> (default (TKey), nullList); - yield return nullGroup; + yield return new Grouping<TKey, TElement> (default (TKey), nullList); counter++; } - Grouping<TKey, TElement> grouping = new Grouping<TKey, TElement> (group.Key, group.Value); - yield return grouping; + + yield return new Grouping<TKey, TElement> (group.Key, group.Value); + counter++; + } + + if (counter == nullCounter) { + yield return new Grouping<TKey, TElement> (default (TKey), nullList); counter++; } } @@ -762,6 +776,16 @@ namespace System.Linq Func<TKey, IEnumerable<TElement>, TResult> resultSelector, IEqualityComparer<TKey> comparer) { + Check.GroupBySelectors (source, keySelector, elementSelector, resultSelector); + + return CreateGroupByIterator (source, keySelector, elementSelector, resultSelector, comparer); + } + + static IEnumerable<TResult> CreateGroupByIterator<TSource, TKey, TElement, TResult> (this IEnumerable<TSource> source, + Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, + Func<TKey, IEnumerable<TElement>, TResult> resultSelector, + IEqualityComparer<TKey> comparer) + { IEnumerable<IGrouping<TKey, TElement>> groups = GroupBy<TSource, TKey, TElement> ( source, keySelector, elementSelector, comparer); @@ -781,6 +805,16 @@ namespace System.Linq Func<TKey, IEnumerable<TSource>, TResult> resultSelector, IEqualityComparer<TKey> comparer) { + Check.SourceAndKeyResultSelectors (source, keySelector, resultSelector); + + return CreateGroupByIterator (source, keySelector, resultSelector, comparer); + } + + static IEnumerable<TResult> CreateGroupByIterator<TSource, TKey, TResult> (this IEnumerable<TSource> source, + Func<TSource, TKey> keySelector, + Func<TKey, IEnumerable<TSource>, TResult> resultSelector, + IEqualityComparer<TKey> comparer) + { IEnumerable<IGrouping<TKey,TSource>> groups = GroupBy<TSource, TKey> (source, keySelector, comparer); foreach (IGrouping<TKey, TSource> group in groups) |