Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJb Evain <jbevain@gmail.com>2010-05-19 18:43:06 +0400
committerJb Evain <jbevain@gmail.com>2010-05-19 18:43:06 +0400
commit41791d06aee1e8d7b9a04eee51d1622640e4523b (patch)
tree744a8707177768ed15cbecd002ff9bee3fd779ad /mcs/class/System.Core/System.Linq/Enumerable.cs
parent7fafeb5b281b8566b2e0afb0596b28b538cebfa3 (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.cs62
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)