1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // Alejandro Serrano "Serras" (trupill@yahoo.es)
21 // Marek Safar (marek.safar@gmail.com)
25 using System.Collections.Generic;
26 using System.Linq.Expressions;
30 public static class Queryable
34 public static int Count<TSource> (this IQueryable<TSource> source)
37 throw new ArgumentNullException ();
39 if (source is ICollection<TSource>)
40 return ((ICollection<TSource>)source).Count;
43 foreach (TSource element in source)
48 public static int Count<TSource> (
49 this IQueryable<TSource> source,
50 Func<TSource, bool> selector)
52 if (source == null || selector == null)
53 throw new ArgumentNullException ();
56 foreach (TSource element in source)
57 if (selector(element))
67 public static long LongCount<TSource> (this IQueryable<TSource> source)
70 throw new ArgumentNullException ();
73 foreach (TSource element in source)
78 public static long LongCount<TSource> (
79 this IQueryable<TSource> source,
80 Func<TSource, bool> selector)
82 if (source == null || selector == null)
83 throw new ArgumentNullException ();
86 foreach (TSource element in source)
87 if (selector(element))
97 public static int Sum (this IQueryable<int> source)
100 throw new ArgumentNullException ();
103 foreach (int element in source)
109 public static int Sum<TSource> (
110 this IQueryable<TSource> source,
111 Func<TSource, int> selector)
113 if (source == null || selector == null)
114 throw new ArgumentNullException ();
117 foreach (TSource element in source)
118 sum += selector (element);
123 public static int? Sum (this IQueryable<int?> source)
126 throw new ArgumentNullException ();
129 foreach (int? element in source)
130 if (element.HasValue)
131 sum += element.Value;
136 public static int? Sum<TSource> (
137 this IQueryable<TSource> source,
138 Func<TSource, int?> selector)
140 if (source == null || selector == null)
141 throw new ArgumentNullException ();
144 foreach (TSource element in source) {
145 int? item = selector (element);
153 public static long Sum (this IQueryable<long> source)
156 throw new ArgumentNullException ();
159 foreach (long element in source)
165 public static long Sum<TSource> (
166 this IQueryable<TSource> source,
167 Func<TSource, long> selector)
169 if (source == null || selector == null)
170 throw new ArgumentNullException ();
173 foreach (TSource element in source)
174 sum += selector (element);
179 public static long? Sum (this IQueryable<long?> source)
182 throw new ArgumentNullException ();
185 foreach (long? element in source)
186 if (element.HasValue)
187 sum += element.Value;
192 public static long? Sum<TSource> (
193 this IQueryable<TSource> source,
194 Func<TSource, long?> selector)
196 if (source == null || selector == null)
197 throw new ArgumentNullException ();
200 foreach (TSource element in source) {
201 long? item = selector (element);
209 public static double Sum (this IQueryable<double> source)
212 throw new ArgumentNullException ();
215 foreach (double element in source)
221 public static double Sum<TSource> (
222 this IQueryable<TSource> source,
223 Func<TSource, double> selector)
225 if (source == null || selector == null)
226 throw new ArgumentNullException ();
229 foreach (TSource element in source)
230 sum += selector (element);
235 public static double? Sum (this IQueryable<double?> source)
238 throw new ArgumentNullException ();
241 foreach (double? element in source)
242 if (element.HasValue)
243 sum += element.Value;
248 public static double? Sum<TSource> (
249 this IQueryable<TSource> source,
250 Func<TSource, double?> selector)
252 if (source == null || selector == null)
253 throw new ArgumentNullException ();
256 foreach (TSource element in source) {
257 double? item = selector (element);
265 public static decimal Sum (this IQueryable<decimal> source)
268 throw new ArgumentNullException ();
271 foreach (decimal element in source)
277 public static decimal Sum<TSource> (
278 this IQueryable<TSource> source,
279 Func<TSource, decimal> selector)
281 if (source == null || selector == null)
282 throw new ArgumentNullException ();
285 foreach (TSource element in source)
286 sum += selector (element);
291 public static decimal? Sum (this IQueryable<decimal?> source)
294 throw new ArgumentNullException ();
297 foreach (decimal? element in source)
298 if (element.HasValue)
299 sum += element.Value;
304 public static decimal? Sum<TSource> (
305 this IQueryable<TSource> source,
306 Func<TSource, decimal?> selector)
308 if (source == null || selector == null)
309 throw new ArgumentNullException ();
312 foreach (TSource element in source) {
313 decimal? item = selector (element);
325 public static int Min (this IQueryable<int> source)
328 throw new ArgumentNullException ();
330 int minimum = int.MaxValue;
332 foreach (int element in source) {
333 if (element < minimum)
339 throw new InvalidOperationException ();
344 public static int? Min (this IQueryable<int?> source)
347 throw new ArgumentNullException ();
349 bool onlyNull = true;
350 int? minimum = int.MaxValue;
351 foreach (int? element in source) {
352 if (element.HasValue) {
354 if (element < minimum)
358 return (onlyNull ? null : minimum);
361 public static long Min (this IQueryable<long> source)
364 throw new ArgumentNullException ();
366 long minimum = long.MaxValue;
368 foreach (long element in source) {
369 if (element < minimum)
375 throw new InvalidOperationException ();
380 public static long? Min (this IQueryable<long?> source)
383 throw new ArgumentNullException ();
385 bool onlyNull = true;
386 long? minimum = long.MaxValue;
387 foreach (long? element in source) {
388 if (element.HasValue) {
390 if (element < minimum)
394 return (onlyNull ? null : minimum);
397 public static double Min (this IQueryable<double> source)
400 throw new ArgumentNullException ();
402 double minimum = double.MaxValue;
404 foreach (double element in source) {
405 if (element < minimum)
411 throw new InvalidOperationException ();
416 public static double? Min (this IQueryable<double?> source)
419 throw new ArgumentNullException ();
421 bool onlyNull = true;
422 double? minimum = double.MaxValue;
423 foreach (double? element in source) {
424 if (element.HasValue) {
426 if (element < minimum)
430 return (onlyNull ? null : minimum);
433 public static decimal Min (this IQueryable<decimal> source)
436 throw new ArgumentNullException ();
438 decimal minimum = decimal.MaxValue;
440 foreach (decimal element in source) {
441 if (element < minimum)
447 throw new InvalidOperationException ();
452 public static decimal? Min (this IQueryable<decimal?> source)
455 throw new ArgumentNullException ();
457 bool onlyNull = true;
458 decimal? minimum = decimal.MaxValue;
459 foreach (decimal? element in source) {
460 if (element.HasValue) {
462 if (element < minimum)
466 return (onlyNull ? null : minimum);
469 public static TSource Min<TSource> (this IQueryable<TSource> source)
472 throw new ArgumentNullException ();
474 bool notAssigned = true;
475 TSource minimum = default (TSource);
477 foreach (TSource element in source) {
484 if (element is IComparable<TSource>)
485 comparison = ((IComparable<TSource>)element).CompareTo (minimum);
486 else if (element is System.IComparable)
487 comparison = ((System.IComparable)element).CompareTo (minimum);
489 throw new ArgumentNullException();
498 throw new InvalidOperationException ();
503 public static int Min<TSource> (
504 this IQueryable<TSource> source,
505 Func<TSource, int> selector)
507 if (source == null || selector == null)
508 throw new ArgumentNullException ();
510 int minimum = int.MaxValue;
512 foreach (TSource item in source) {
513 int element = selector (item);
514 if (element < minimum)
520 throw new InvalidOperationException ();
525 public static int? Min<TSource> (
526 this IQueryable<TSource> source,
527 Func<TSource, int?> selector)
529 if (source == null || selector == null)
530 throw new ArgumentNullException ();
532 bool onlyNull = true;
533 int? minimum = int.MaxValue;
534 foreach (TSource item in source) {
535 int? element = selector (item);
536 if (element.HasValue) {
538 if (element < minimum)
542 return (onlyNull ? null : minimum);
545 public static long Min<TSource> (
546 this IQueryable<TSource> source,
547 Func<TSource, long> selector)
549 if (source == null || selector == null)
550 throw new ArgumentNullException ();
552 long minimum = long.MaxValue;
554 foreach (TSource item in source) {
555 long element = selector (item);
556 if (element < minimum)
562 throw new InvalidOperationException ();
567 public static long? Min<TSource> (
568 this IQueryable<TSource> source,
569 Func<TSource, long?> selector)
571 if (source == null || selector == null)
572 throw new ArgumentNullException ();
574 bool onlyNull = true;
575 long? minimum = long.MaxValue;
576 foreach (TSource item in source) {
577 long? element = selector (item);
578 if (element.HasValue) {
580 if (element < minimum)
584 return (onlyNull ? null : minimum);
587 public static double Min<TSource> (
588 this IQueryable<TSource> source,
589 Func<TSource, double> selector)
591 if (source == null || selector == null)
592 throw new ArgumentNullException ();
594 double minimum = double.MaxValue;
596 foreach (TSource item in source)
598 double element = selector (item);
599 if (element < minimum)
605 throw new InvalidOperationException ();
610 public static double? Min<TSource> (
611 this IQueryable<TSource> source,
612 Func<TSource, double?> selector)
614 if (source == null || selector == null)
615 throw new ArgumentNullException ();
617 bool onlyNull = true;
618 double? minimum = double.MaxValue;
619 foreach (TSource item in source) {
620 double? element = selector (item);
621 if (element.HasValue) {
623 if (element < minimum)
627 return (onlyNull ? null : minimum);
630 public static decimal Min<TSource> (
631 this IQueryable<TSource> source,
632 Func<TSource, decimal> selector)
634 if (source == null || selector == null)
635 throw new ArgumentNullException ();
637 decimal minimum = decimal.MaxValue;
639 foreach (TSource item in source) {
640 decimal element = selector (item);
641 if (element < minimum)
647 throw new InvalidOperationException ();
652 public static decimal? Min<TSource> (
653 this IQueryable<TSource> source,
654 Func<TSource, decimal?> selector)
656 if (source == null || selector == null)
657 throw new ArgumentNullException ();
659 bool onlyNull = true;
660 decimal? minimum = decimal.MaxValue;
661 foreach (TSource item in source) {
662 decimal? element = selector (item);
663 if (element.HasValue) {
665 if (element < minimum)
669 return (onlyNull ? null : minimum);
672 public static TResult Min<TSource, TResult> (
673 this IQueryable<TSource> source,
674 Func<TSource, TResult> selector)
676 if (source == null || selector == null)
677 throw new ArgumentNullException ();
679 bool notAssigned = true;
680 TResult minimum = default (TResult);
682 foreach (TSource item in source) {
683 TResult element = selector (item);
690 if (element is IComparable<TResult>)
691 comparison = ((IComparable<TResult>)element).CompareTo (minimum);
692 else if (element is System.IComparable)
693 comparison = ((System.IComparable)element).CompareTo (minimum);
695 throw new ArgumentNullException ();
704 throw new InvalidOperationException ();
713 public static int Max (this IQueryable<int> source)
716 throw new ArgumentNullException ();
718 int maximum = int.MinValue;
720 foreach (int element in source) {
721 if (element > maximum)
727 throw new InvalidOperationException ();
732 public static int? Max (this IQueryable<int?> source)
735 throw new ArgumentNullException ();
737 bool onlyNull = true;
738 int? maximum = int.MinValue;
739 foreach (int? element in source) {
740 if (element.HasValue) {
742 if (element > maximum)
746 return (onlyNull ? null : maximum);
749 public static long Max (this IQueryable<long> source)
752 throw new ArgumentNullException ();
754 long maximum = long.MinValue;
756 foreach (long element in source) {
757 if (element > maximum)
763 throw new InvalidOperationException ();
768 public static long? Max (this IQueryable<long?> source)
771 throw new ArgumentNullException ();
773 bool onlyNull = true;
774 long? maximum = long.MinValue;
775 foreach (long? element in source) {
776 if (element.HasValue) {
778 if (element > maximum)
782 return (onlyNull ? null : maximum);
785 public static double Max (
786 this IQueryable<double> source)
789 throw new ArgumentNullException ();
791 double maximum = double.MinValue;
793 foreach (double element in source) {
794 if (element > maximum)
800 throw new InvalidOperationException ();
805 public static double? Max (
806 this IQueryable<double?> source)
809 throw new ArgumentNullException ();
811 bool onlyNull = true;
812 double? maximum = double.MinValue;
813 foreach (double? element in source) {
814 if (element.HasValue) {
816 if (element > maximum)
820 return (onlyNull ? null : maximum);
823 public static decimal Max (
824 this IQueryable<decimal> source)
827 throw new ArgumentNullException ();
829 decimal maximum = decimal.MinValue;
831 foreach (decimal element in source) {
832 if (element > maximum)
838 throw new InvalidOperationException ();
843 public static decimal? Max (
844 this IQueryable<decimal?> source)
847 throw new ArgumentNullException ();
849 bool onlyNull = true;
850 decimal? maximum = decimal.MinValue;
851 foreach (decimal? element in source) {
852 if (element.HasValue) {
854 if (element > maximum)
858 return (onlyNull ? null : maximum);
861 public static TSource Max<TSource> (
862 this IQueryable<TSource> source)
865 throw new ArgumentNullException ();
867 bool notAssigned = true;
868 TSource maximum = default (TSource);
870 foreach (TSource element in source) {
877 if (element is IComparable<TSource>)
878 comparison = ((IComparable<TSource>)element).CompareTo (maximum);
879 else if (element is System.IComparable)
880 comparison = ((System.IComparable)element).CompareTo (maximum);
882 throw new ArgumentNullException();
891 throw new InvalidOperationException ();
896 public static int Max<TSource> (
897 this IQueryable<TSource> source,
898 Func<TSource, int> selector)
900 if (source == null || selector == null)
901 throw new ArgumentNullException ();
903 int maximum = int.MinValue;
905 foreach (TSource item in source)
907 int element = selector (item);
908 if (element > maximum)
914 throw new InvalidOperationException ();
919 public static int? Max<TSource> (
920 this IQueryable<TSource> source,
921 Func<TSource, int?> selector)
923 if (source == null || selector == null)
924 throw new ArgumentNullException ();
926 bool onlyNull = true;
927 int? maximum = int.MinValue;
928 foreach (TSource item in source) {
929 int? element = selector (item);
930 if (element.HasValue) {
932 if (element > maximum)
936 return (onlyNull ? null : maximum);
939 public static long Max<TSource> (
940 this IQueryable<TSource> source,
941 Func<TSource, long> selector)
943 if (source == null || selector == null)
944 throw new ArgumentNullException ();
946 long maximum = long.MinValue;
948 foreach (TSource item in source) {
949 long element = selector (item);
950 if (element > maximum)
956 throw new InvalidOperationException ();
961 public static long? Max<TSource> (
962 this IQueryable<TSource> source,
963 Func<TSource, long?> selector)
965 if (source == null || selector == null)
966 throw new ArgumentNullException ();
968 bool onlyNull = true;
969 long? maximum = long.MinValue;
970 foreach (TSource item in source) {
971 long? element = selector (item);
972 if (element.HasValue) {
974 if (element > maximum)
978 return (onlyNull ? null : maximum);
981 public static double Max<TSource> (
982 this IQueryable<TSource> source,
983 Func<TSource, double> selector)
985 if (source == null || selector == null)
986 throw new ArgumentNullException ();
988 double maximum = double.MinValue;
990 foreach (TSource item in source) {
991 double element = selector (item);
992 if (element > maximum)
998 throw new InvalidOperationException ();
1003 public static double? Max<TSource> (
1004 this IQueryable<TSource> source,
1005 Func<TSource, double?> selector)
1007 if (source == null || selector == null)
1008 throw new ArgumentNullException ();
1010 bool onlyNull = true;
1011 double? maximum = double.MinValue;
1012 foreach (TSource item in source) {
1013 double? element = selector(item);
1014 if (element.HasValue) {
1016 if (element > maximum)
1020 return (onlyNull ? null : maximum);
1023 public static decimal Max<TSource> (
1024 this IQueryable<TSource> source,
1025 Func<TSource, decimal> selector)
1027 if (source == null || selector == null)
1028 throw new ArgumentNullException ();
1030 decimal maximum = decimal.MinValue;
1032 foreach (TSource item in source) {
1033 decimal element = selector(item);
1034 if (element > maximum)
1040 throw new InvalidOperationException ();
1045 public static decimal? Max<TSource> (
1046 this IQueryable<TSource> source,
1047 Func<TSource, decimal?> selector)
1049 if (source == null || selector == null)
1050 throw new ArgumentNullException ();
1052 bool onlyNull = true;
1053 decimal? maximum = decimal.MinValue;
1054 foreach (TSource item in source) {
1055 decimal? element = selector(item);
1056 if (element.HasValue) {
1058 if (element > maximum)
1062 return (onlyNull ? null : maximum);
1065 public static TResult Max<TSource, TResult> (
1066 this IQueryable<TSource> source,
1067 Func<TSource, TResult> selector)
1069 if (source == null || selector == null)
1070 throw new ArgumentNullException ();
1072 bool notAssigned = true;
1073 TResult maximum = default (TResult);
1075 foreach (TSource item in source)
1077 TResult element = selector (item);
1080 notAssigned = false;
1084 if (element is IComparable<TResult>)
1085 comparison = ((IComparable<TResult>)element).CompareTo (maximum);
1086 else if (element is System.IComparable)
1087 comparison = ((System.IComparable)element).CompareTo (maximum);
1089 throw new ArgumentNullException();
1098 throw new InvalidOperationException ();
1107 public static double Average (this IQueryable<int> source)
1110 throw new ArgumentNullException ();
1114 foreach (int element in source) {
1120 throw new InvalidOperationException ();
1122 return (double)sum / (double)counter;
1125 public static double? Average (this IQueryable<int?> source)
1128 throw new ArgumentNullException ();
1130 bool onlyNull = true;
1133 foreach (int? element in source) {
1134 if (element.HasValue) {
1136 sum += element.Value;
1140 return (onlyNull ? null : (double?)sum / (double?)counter);
1143 public static double Average (this IQueryable<long> source)
1146 throw new ArgumentNullException ();
1150 foreach (long element in source) {
1156 throw new InvalidOperationException ();
1158 return (double)sum / (double)counter;
1161 public static double? Average (this IQueryable<long?> source)
1164 throw new ArgumentNullException ();
1166 bool onlyNull = true;
1169 foreach (long? element in source) {
1170 if (element.HasValue) {
1172 sum += element.Value;
1176 return (onlyNull ? null : (double?)sum / (double?)counter);
1179 public static double Average (this IQueryable<double> source)
1182 throw new ArgumentNullException ();
1186 foreach (double element in source) {
1192 throw new InvalidOperationException ();
1194 return sum / counter;
1197 public static double? Average (this IQueryable<double?> source)
1200 throw new ArgumentNullException ();
1202 bool onlyNull = true;
1205 foreach (double? element in source) {
1206 if (element.HasValue) {
1208 sum += element.Value;
1212 return (onlyNull ? null : (double?)(sum / counter));
1215 public static decimal Average (this IQueryable<decimal> source)
1218 throw new ArgumentNullException ();
1221 decimal counter = 0;
1222 foreach (decimal element in source) {
1228 throw new InvalidOperationException ();
1230 return sum / counter;
1233 public static decimal? Average (this IQueryable<decimal?> source)
1236 throw new ArgumentNullException ();
1238 bool onlyNull = true;
1240 decimal counter = 0;
1241 foreach (decimal? element in source) {
1242 if (element.HasValue) {
1244 sum += element.Value;
1248 return (onlyNull ? null : (decimal?)(sum / counter));
1251 public static double Average<TSource> (this IQueryable<TSource> source,
1252 Func<TSource, int> selector)
1254 if (source == null || selector == null)
1255 throw new ArgumentNullException ();
1259 foreach (TSource item in source) {
1260 sum += selector (item);
1265 throw new InvalidOperationException ();
1267 return (double)sum / (double)counter;
1270 public static double? Average<TSource> (this IQueryable<TSource> source,
1271 Func<TSource, int?> selector)
1273 if (source == null || selector == null)
1274 throw new ArgumentNullException ();
1276 bool onlyNull = true;
1279 foreach (TSource item in source) {
1280 int? element = selector (item);
1281 if (element.HasValue) {
1283 sum += element.Value;
1287 return (onlyNull ? null : (double?)sum / (double?)counter);
1290 public static double Average<TSource> (this IQueryable<TSource> source,
1291 Func<TSource, long> selector)
1293 if (source == null || selector == null)
1294 throw new ArgumentNullException ();
1298 foreach (TSource item in source) {
1299 sum += selector (item);
1304 throw new InvalidOperationException();
1306 return (double)sum / (double)counter;
1309 public static double? Average<TSource> (this IQueryable<TSource> source,
1310 Func<TSource, long?> selector)
1312 if (source == null || selector == null)
1313 throw new ArgumentNullException ();
1315 bool onlyNull = true;
1318 foreach (TSource item in source) {
1319 long? element = selector (item);
1320 if (element.HasValue) {
1322 sum += element.Value;
1326 return (onlyNull ? null : (double?)sum/(double?)counter);
1329 public static double Average<TSource> (this IQueryable<TSource> source,
1330 Func<TSource, double> selector)
1332 if (source == null || selector == null)
1333 throw new ArgumentNullException ();
1337 foreach (TSource item in source) {
1338 sum += selector (item);
1343 throw new InvalidOperationException ();
1345 return sum / counter;
1348 public static double? Average<TSource> (this IQueryable<TSource> source,
1349 Func<TSource, double?> selector)
1351 if (source == null || selector == null)
1352 throw new ArgumentNullException ();
1354 bool onlyNull = true;
1357 foreach (TSource item in source) {
1358 double? element = selector (item);
1359 if (element.HasValue) {
1361 sum += element.Value;
1365 return (onlyNull ? null : (double?)(sum/counter));
1368 public static decimal Average<TSource> (this IQueryable<TSource> source,
1369 Func<TSource, decimal> selector)
1371 if (source == null || selector == null)
1372 throw new ArgumentNullException ();
1375 decimal counter = 0;
1376 foreach (TSource item in source) {
1377 sum += selector(item);
1382 throw new InvalidOperationException ();
1384 return sum / counter;
1387 public static decimal? Average<TSource> (this IQueryable<TSource> source,
1388 Func<TSource, decimal?> selector)
1390 if (source == null || selector == null)
1391 throw new ArgumentNullException ();
1393 bool onlyNull = true;
1395 decimal counter = 0;
1396 foreach (TSource item in source) {
1397 decimal? element = selector (item);
1398 if (element.HasValue) {
1400 sum += element.Value;
1404 return (onlyNull ? null : (decimal?)(sum/counter));
1411 [Obsolete ("Use Aggregate instead")]
1412 [System.Runtime.CompilerServices.Extension]
1413 public static TSource Fold<TSource> (
1414 IQueryable<TSource> source,
1415 Func<TSource, TSource, TSource> func)
1417 return Fold<TSource> (source, func);
1420 [Obsolete ("Use Aggregate instead")]
1421 [System.Runtime.CompilerServices.Extension]
1422 public static U Fold<TSource, U> (
1423 IQueryable<TSource> source,
1425 Func<U, TSource, U> func)
1427 return Fold<TSource, U> (source, seed, func);
1434 public static TSource Aggregate<TSource> (
1435 this IQueryable<TSource> source,
1436 Func<TSource, TSource, TSource> func)
1438 if (source == null || func == null)
1439 throw new ArgumentNullException ();
1442 TSource folded = default (TSource);
1444 foreach (TSource element in source) {
1448 folded = func (folded, element);
1452 throw new InvalidOperationException ();
1457 public static U Aggregate<TSource, U> (
1458 this IQueryable<TSource> source,
1460 Func<U, TSource, U> func)
1462 if (source == null || func == null)
1463 throw new ArgumentNullException ();
1466 foreach (TSource element in source)
1467 folded = func (folded, element);
1475 public static IEnumerable<TSource> Concat<TSource> (
1476 this IQueryable<TSource> first,
1477 IEnumerable<TSource> second)
1479 if (first == null || second == null)
1480 throw new ArgumentNullException ();
1482 foreach (TSource element in first)
1483 yield return element;
1484 foreach (TSource element in second)
1485 yield return element;
1492 [System.Runtime.CompilerServices.Extension]
1493 public static IQueryable<TSource> ToSequence<TSource> (
1494 IQueryable<TSource> source)
1496 return (IQueryable<TSource>)source;
1503 [System.Runtime.CompilerServices.Extension]
1504 public static TSource[] ToArray<TSource> (
1505 IQueryable<TSource> source)
1508 throw new ArgumentNullException ();
1510 List<TSource> list = new List<TSource> (source);
1511 return list.ToArray ();
1518 [System.Runtime.CompilerServices.Extension]
1519 public static List<TSource> ToList<TSource> (
1520 IQueryable<TSource> source)
1523 throw new ArgumentNullException ();
1525 return new List<TSource> (source);
1530 #region ToDictionary
1532 [System.Runtime.CompilerServices.Extension]
1533 public static Dictionary<K, TSource> ToDictionary<TSource, K> (
1534 IQueryable<TSource> source,
1535 Func<TSource, K> keySelector)
1537 return ToDictionary<TSource, K> (source, keySelector, null);
1540 [System.Runtime.CompilerServices.Extension]
1541 public static Dictionary<K, TSource> ToDictionary<TSource, K> (
1542 IQueryable<TSource> source,
1543 Func<TSource, K> keySelector,
1544 IEqualityComparer<K> comparer)
1546 if (source == null || keySelector == null)
1547 throw new ArgumentNullException ();
1549 Dictionary<K, TSource> dictionary = new Dictionary<K, TSource> (comparer ?? EqualityComparer<K>.Default);
1550 foreach (TSource element in source) {
1551 K key = keySelector (element);
1553 throw new ArgumentNullException ();
1554 else if (dictionary.ContainsKey (key))
1555 throw new ArgumentException ();
1557 dictionary.Add (key, element);
1562 [System.Runtime.CompilerServices.Extension]
1563 public static Dictionary<K, E> ToDictionary<TSource, K, E> (
1564 IQueryable<TSource> source,
1565 Func<TSource, K> keySelector,
1566 Func<TSource, E> elementSelector)
1568 return ToDictionary<TSource, K, E> (source, keySelector, elementSelector, null);
1571 [System.Runtime.CompilerServices.Extension]
1572 public static Dictionary<K, E> ToDictionary<TSource, K, E> (
1573 IQueryable<TSource> source,
1574 Func<TSource, K> keySelector,
1575 Func<TSource, E> elementSelector,
1576 IEqualityComparer<K> comparer)
1578 if (source == null || keySelector == null || elementSelector == null)
1579 throw new ArgumentNullException ();
1581 Dictionary<K, E> dictionary = new Dictionary<K, E>(comparer ?? EqualityComparer<K>.Default);
1582 foreach (TSource element in source)
1584 K key = keySelector (element);
1586 throw new ArgumentNullException ();
1587 else if (dictionary.ContainsKey (key))
1588 throw new ArgumentException ();
1590 dictionary.Add(key, elementSelector (element));
1599 [System.Runtime.CompilerServices.Extension]
1600 public static Lookup<K, TSource> ToLookup<TSource, K> (
1601 IQueryable<TSource> source,
1602 Func<TSource, K> keySelector)
1604 return ToLookup<TSource, K> (source, keySelector, null);
1607 [System.Runtime.CompilerServices.Extension]
1608 public static Lookup<K, TSource> ToLookup<TSource, K> (
1609 IQueryable<TSource> source,
1610 Func<TSource, K> keySelector,
1611 IEqualityComparer<K> comparer)
1613 if (source == null || keySelector == null)
1614 throw new ArgumentNullException ();
1616 Dictionary<K, List<TSource>> dictionary = new Dictionary<K, List<TSource>> (comparer ?? EqualityComparer<K>.Default);
1617 foreach (TSource element in source) {
1618 K key = keySelector (element);
1620 throw new ArgumentNullException ();
1621 if (!dictionary.ContainsKey (key))
1622 dictionary.Add (key, new List<TSource> ());
1623 dictionary[key].Add (element);
1625 return new Lookup<K, TSource> (dictionary);
1628 [System.Runtime.CompilerServices.Extension]
1629 public static Lookup<K, E> ToLookup<TSource, K, E> (
1630 IQueryable<TSource> source,
1631 Func<TSource, K> keySelector,
1632 Func<TSource, E> elementSelector)
1634 return ToLookup<TSource, K, E> (source, keySelector, elementSelector, null);
1637 [System.Runtime.CompilerServices.Extension]
1638 public static Lookup<K, E> ToLookup<TSource, K, E> (
1639 IQueryable<TSource> source,
1640 Func<TSource, K> keySelector,
1641 Func<TSource, E> elementSelector,
1642 IEqualityComparer<K> comparer)
1644 if (source == null || keySelector == null || elementSelector == null)
1645 throw new ArgumentNullException ();
1647 Dictionary<K, List<E>> dictionary = new Dictionary<K, List<E>>(comparer ?? EqualityComparer<K>.Default);
1648 foreach (TSource element in source)
1650 K key = keySelector (element);
1652 throw new ArgumentNullException ();
1653 if (!dictionary.ContainsKey (key))
1654 dictionary.Add (key, new List<E> ());
1655 dictionary[key].Add (elementSelector (element));
1657 return new Lookup<K, E> (dictionary);
1664 public static IEnumerable<TResult> OfType<TResult> (this IQueryable source)
1667 throw new ArgumentNullException ();
1669 foreach (object element in source)
1670 if (element is TResult)
1671 yield return (TResult)element;
1678 public static IEnumerable<TResult> Cast<TResult> (this IQueryable source)
1681 throw new ArgumentNullException ();
1683 foreach (object element in source)
1684 yield return (TResult)element;
1691 public static TSource First<TSource> (this IQueryable<TSource> source)
1694 throw new ArgumentNullException ();
1696 foreach (TSource element in source)
1699 throw new InvalidOperationException ();
1702 public static TSource First<TSource> (
1703 this IQueryable<TSource> source,
1704 Func<TSource, bool> predicate)
1706 if (source == null || predicate == null)
1707 throw new ArgumentNullException ();
1709 foreach (TSource element in source) {
1710 if (predicate (element))
1714 throw new InvalidOperationException ();
1719 #region FirstOrDefault
1721 public static TSource FirstOrDefault<TSource> (this IQueryable<TSource> source)
1724 throw new ArgumentNullException ();
1726 foreach (TSource element in source)
1729 return default (TSource);
1732 public static TSource FirstOrDefault<TSource> (
1733 this IQueryable<TSource> source,
1734 Func<TSource, bool> predicate)
1736 if (source == null || predicate == null)
1737 throw new ArgumentNullException ();
1739 foreach (TSource element in source) {
1740 if (predicate (element))
1744 return default (TSource);
1751 public static TSource Last<TSource> (this IQueryable<TSource> source)
1754 throw new ArgumentNullException ();
1756 bool noElements = true;
1757 TSource lastElement = default (TSource);
1758 foreach (TSource element in source)
1760 if (noElements) noElements = false;
1761 lastElement = element;
1767 throw new InvalidOperationException();
1770 public static TSource Last<TSource> (
1771 this IQueryable<TSource> source,
1772 Func<TSource, bool> predicate)
1774 if (source == null || predicate == null)
1775 throw new ArgumentNullException ();
1777 bool noElements = true;
1778 TSource lastElement = default (TSource);
1779 foreach (TSource element in source) {
1780 if (predicate (element))
1782 if (noElements) noElements = false;
1783 lastElement = element;
1790 throw new InvalidOperationException ();
1795 #region LastOrDefault
1797 public static TSource LastOrDefault<TSource> (this IQueryable<TSource> source)
1800 throw new ArgumentNullException ();
1802 TSource lastElement = default (TSource);
1803 foreach (TSource element in source)
1804 lastElement = element;
1809 public static TSource LastOrDefault<TSource> (
1810 this IQueryable<TSource> source,
1811 Func<TSource, bool> predicate)
1813 if (source == null || predicate == null)
1814 throw new ArgumentNullException ();
1816 TSource lastElement = default (TSource);
1817 foreach (TSource element in source) {
1818 if (predicate (element))
1819 lastElement = element;
1829 public static TSource Single<TSource> (this IQueryable<TSource> source)
1832 throw new ArgumentNullException ();
1834 bool otherElement = false;
1835 TSource singleElement = default (TSource);
1836 foreach (TSource element in source)
1838 if (otherElement) throw new InvalidOperationException ();
1839 if (!otherElement) otherElement = true;
1840 singleElement = element;
1844 return singleElement;
1846 throw new InvalidOperationException();
1849 public static TSource Single<TSource> (
1850 this IQueryable<TSource> source,
1851 Func<TSource, bool> predicate)
1853 if (source == null || predicate == null)
1854 throw new ArgumentNullException ();
1856 bool otherElement = false;
1857 TSource singleElement = default (TSource);
1858 foreach (TSource element in source) {
1859 if (predicate (element))
1861 if (otherElement) throw new InvalidOperationException ();
1862 if (!otherElement) otherElement = true;
1863 singleElement = element;
1868 return singleElement;
1870 throw new InvalidOperationException ();
1875 #region SingleOrDefault
1877 public static TSource SingleOrDefault<TSource> (this IQueryable<TSource> source)
1880 throw new ArgumentNullException ();
1882 bool otherElement = false;
1883 TSource singleElement = default (TSource);
1884 foreach (TSource element in source)
1886 if (otherElement) throw new InvalidOperationException ();
1887 if (!otherElement) otherElement = true;
1888 singleElement = element;
1891 return singleElement;
1894 public static TSource SingleOrDefault<TSource> (
1895 this IQueryable<TSource> source,
1896 Func<TSource, bool> predicate)
1898 if (source == null || predicate == null)
1899 throw new ArgumentNullException ();
1901 bool otherElement = false;
1902 TSource singleElement = default (TSource);
1903 foreach (TSource element in source) {
1904 if (predicate (element))
1906 if (otherElement) throw new InvalidOperationException ();
1907 if (!otherElement) otherElement = true;
1908 singleElement = element;
1912 return singleElement;
1919 public static TSource ElementAt<TSource> (
1920 this IQueryable<TSource> source,
1924 throw new ArgumentNullException ();
1926 throw new ArgumentOutOfRangeException ();
1928 if (source is IList<TSource>)
1929 return ((IList<TSource>)source)[index];
1932 foreach (TSource element in source) {
1933 if (counter == index)
1937 throw new ArgumentOutOfRangeException();
1943 #region ElementAtOrDefault
1945 public static TSource ElementAtOrDefault<TSource> (
1946 this IQueryable<TSource> source,
1950 throw new ArgumentNullException ();
1952 return default(TSource);
1954 if (source is IList<TSource>)
1956 if (((IList<TSource>)source).Count >= index)
1957 return default(TSource);
1959 return ((IList<TSource>)source)[index];
1963 foreach (TSource element in source) {
1964 if (counter == index)
1968 return default (TSource);
1974 #region DefaultIfEmpty
1976 public static IEnumerable<TSource> DefaultIfEmpty<TSource> (
1977 this IQueryable<TSource> source)
1980 throw new ArgumentNullException ();
1982 bool noYield = true;
1983 foreach (TSource item in source)
1990 yield return default (TSource);
1993 public static IEnumerable<TSource> DefaultIfEmpty<TSource> (
1994 this IQueryable<TSource> source,
1995 TSource defaultValue)
1998 throw new ArgumentNullException ();
2000 bool noYield = true;
2001 foreach (TSource item in source)
2008 yield return defaultValue;
2015 [System.Runtime.CompilerServices.Extension]
2016 public static bool EqualAll<TSource> (
2017 IQueryable<TSource> first,
2018 IQueryable<TSource> second)
2020 if (first == null || second == null)
2021 throw new ArgumentNullException ();
2023 List<TSource> firstList = new List<TSource> (first);
2024 List<TSource> secondList = new List<TSource> (second);
2026 if (firstList.Count != firstList.Count)
2029 for (int i = 0; i < firstList.Count; i++) {
2030 if (!System.Object.Equals (firstList [i], secondList [i]))
2033 // If no pair of elements is different, then everything is equal
2041 [System.Runtime.CompilerServices.Extension]
2042 public static IEnumerable<int> Range (
2043 int start, int count)
2045 if (count < 0 || (start + count - 1) > int.MaxValue)
2046 throw new ArgumentOutOfRangeException ();
2048 for (int i = start; i < (start + count - 1); i++)
2056 public static IEnumerable<TSource> Repeat<TSource> (this TSource element, int count)
2059 throw new ArgumentOutOfRangeException ();
2061 for (int i = 0; i < count; i++)
2062 yield return element;
2067 /** A NOTE ON IMPLEMENTATION REGARDING NULL KEYS
2069 * GroupBy specification states that null-key values
2070 * are allowed. However, all implementations of
2071 * Dictionary<K, TSource> ban null keys.
2072 * Because of this, a small trick has to be done:
2073 * a special List<TSource> variable is created in order to
2074 * be filled with this null-key values.
2075 * Also, groups must be yielded in the order their
2076 * keys were found for first time, so we need to keep
2077 * a record on when the null-key values appeared
2078 * (that is nullCounter variable).
2079 * Then, when results are iterated and yielded, we
2080 * mantain a counter and if null-key values were
2081 * found, they are yielded in the order needed.
2082 * Because K can be a valuetype, compilers expose a
2083 * restriction on null values, that's why default(TSource)
2084 * is used. However, default(TSource) is null for
2085 * reference types, and values with selectors that
2086 * return value types can't return null. **/
2090 private static List<TSource> ContainsGroup<K, TSource>(
2091 Dictionary<K, List<TSource>> items, K key, IEqualityComparer<K> comparer)
2093 IEqualityComparer<K> comparerInUse = (comparer ?? EqualityComparer<K>.Default);
2094 foreach (KeyValuePair<K, List<TSource>> value in items) {
2095 if (comparerInUse.Equals(value.Key, key))
2101 public static IQueryable<IGrouping<K, TSource>> GroupBy<TSource, K> (
2102 this IQueryable<TSource> source,
2103 Func<TSource, K> keySelector)
2105 throw new NotImplementedException ();
2106 //return GroupBy<TSource, K> (source, keySelector, null);
2109 [System.Runtime.CompilerServices.Extension]
2110 public static IQueryable<IGrouping<K, TSource>> GroupBy<TSource, K> (
2111 IQueryable<TSource> source,
2112 Func<TSource, K> keySelector,
2113 IEqualityComparer<K> comparer)
2115 if (source == null || keySelector == null)
2116 throw new ArgumentNullException ();
2118 Dictionary<K, List<TSource>> groups = new Dictionary<K, List<TSource>> ();
2119 List<TSource> nullList = new List<TSource> ();
2121 int nullCounter = -1;
2123 foreach (TSource element in source) {
2124 K key = keySelector (element);
2126 nullList.Add (element);
2127 if (nullCounter == -1) {
2128 nullCounter = counter;
2133 List<TSource> group = ContainsGroup<K, TSource> (groups, key, comparer);
2134 if (group == null) {
2135 group = new List<TSource> ();
2136 groups.Add (key, group);
2139 group.Add (element);
2144 foreach (KeyValuePair<K, List<TSource>> group in groups) {
2145 if (counter == nullCounter) {
2146 Grouping<K, TSource> nullGroup = new Grouping<K, TSource> (default (K), nullList);
2147 yield return nullGroup;
2150 Grouping<K, TSource> grouping = new Grouping<K, TSource> (group.Key, group.Value);
2151 yield return grouping;
2157 public static IQueryable<IGrouping<K, E>> GroupBy<TSource, K, E> (
2158 this IQueryable<TSource> source,
2159 Func<TSource, K> keySelector,
2160 Func<TSource, E> elementSelector)
2162 return GroupBy<TSource, K, E> (source, keySelector, elementSelector);
2165 public static IEnumerable<IGrouping<K, E>> GroupBy<TSource, K, E> (
2166 this IQueryable<TSource> source,
2167 Func<TSource, K> keySelector,
2168 Func<TSource, E> elementSelector,
2169 IEqualityComparer<K> comparer)
2171 if (source == null || keySelector == null || elementSelector == null)
2172 throw new ArgumentNullException ();
2174 Dictionary<K, List<E>> groups = new Dictionary<K, List<E>> ();
2175 List<E> nullList = new List<E> ();
2177 int nullCounter = -1;
2179 foreach (TSource item in source) {
2180 K key = keySelector (item);
2181 E element = elementSelector (item);
2183 nullList.Add(element);
2184 if (nullCounter == -1) {
2185 nullCounter = counter;
2190 List<E> group = ContainsGroup<K, E> (groups, key, comparer);
2191 if (group == null) {
2192 group = new List<E> ();
2193 groups.Add (key, group);
2196 group.Add (element);
2201 foreach (KeyValuePair<K, List<E>> group in groups) {
2202 if (counter == nullCounter) {
2203 Grouping<K, E> nullGroup = new Grouping<K, E> (default (K), nullList);
2204 yield return nullGroup;
2207 Grouping<K, E> grouping = new Grouping<K, E> (group.Key, group.Value);
2208 yield return grouping;
2217 public static OrderedSequence<TSource> OrderBy<TSource, K> (
2218 this IQueryable<TSource> source,
2219 Func<TSource, K> keySelector)
2221 return OrderBy<TSource, K> (source, keySelector, null);
2224 public static OrderedSequence<TSource> OrderBy<TSource, K> (
2225 this IQueryable<TSource> source,
2226 Func<TSource, K> keySelector,
2227 IComparer<K> comparer)
2229 if (source == null || keySelector == null)
2230 throw new ArgumentNullException ();
2232 return new InternalOrderedSequence<TSource, K> (
2233 source, keySelector, (comparer ?? Comparer<K>.Default), false, null);
2238 #region OrderByDescending
2240 public static OrderedSequence<TSource> OrderByDescending<TSource, K> (
2241 this IQueryable<TSource> source,
2242 Func<TSource, K> keySelector)
2244 return OrderByDescending<TSource, K> (source, keySelector, null);
2247 public static OrderedSequence<TSource> OrderByDescending<TSource, K> (
2248 this IQueryable<TSource> source,
2249 Func<TSource, K> keySelector,
2250 IComparer<K> comparer)
2252 if (source == null || keySelector == null)
2253 throw new ArgumentNullException ();
2255 return new InternalOrderedSequence<TSource, K> (
2256 source, keySelector, (comparer ?? Comparer<K>.Default), true, null);
2263 public static OrderedSequence<TSource> ThenBy<TSource, K> (
2264 this OrderedSequence<TSource> source,
2265 Func<TSource, K> keySelector)
2267 return ThenBy<TSource, K> (source, keySelector, null);
2270 public static OrderedSequence<TSource> ThenBy<TSource, K> (
2271 this OrderedSequence<TSource> source,
2272 Func<TSource, K> keySelector,
2273 IComparer<K> comparer)
2275 if (source == null || keySelector == null)
2276 throw new ArgumentNullException ();
2278 return new InternalOrderedSequence<TSource, K> (
2279 source, keySelector, (comparer ?? Comparer<K>.Default), false, source);
2284 #region ThenByDescending
2286 public static OrderedSequence<TSource> ThenByDescending<TSource, K> (
2287 this OrderedSequence<TSource> source,
2288 Func<TSource, K> keySelector)
2290 return ThenByDescending<TSource, K> (source, keySelector, null);
2293 public static OrderedSequence<TSource> ThenByDescending<TSource, K> (
2294 this OrderedSequence<TSource> source,
2295 Func<TSource, K> keySelector,
2296 IComparer<K> comparer)
2298 if (source == null || keySelector == null)
2299 throw new ArgumentNullException ();
2301 return new InternalOrderedSequence<TSource, K> (
2302 source, keySelector, (comparer ?? Comparer<K>.Default), true, source);
2309 public static IQueryable<TSource> Reverse<TSource> (
2310 this IQueryable<TSource> source)
2313 throw new ArgumentNullException ();
2315 //List<TSource> list = new List<TSource> (source);
2318 throw new NotImplementedException ();
2325 public static IEnumerable<TSource> Take<TSource> (
2326 this IQueryable<TSource> source,
2330 throw new ArgumentNullException ();
2336 foreach (TSource element in source) {
2337 yield return element;
2339 if (counter == count)
2349 public static IEnumerable<TSource> Skip<TSource> (
2350 this IQueryable<TSource> source,
2354 throw new ArgumentNullException ();
2361 foreach (TSource element in source) {
2363 yield return element;
2366 if (counter == count)
2376 public static IEnumerable<TSource> TakeWhile<TSource> (
2377 this IQueryable<TSource> source,
2378 Func<TSource, bool> predicate)
2380 if (source == null || predicate == null)
2381 throw new ArgumentNullException ();
2383 foreach (TSource element in source) {
2384 if (predicate (element))
2385 yield return element;
2391 public static IEnumerable<TSource> TakeWhile<TSource> (
2392 this IQueryable<TSource> source,
2393 Func<TSource, int, bool> predicate)
2395 if (source == null || predicate == null)
2396 throw new ArgumentNullException ();
2399 foreach (TSource element in source)
2401 if (predicate (element, counter))
2402 yield return element;
2413 public static IEnumerable<TSource> SkipWhile<TSource> (
2414 this IQueryable<TSource> source,
2415 Func<TSource, bool> predicate)
2417 if (source == null || predicate == null)
2418 throw new ArgumentNullException ();
2422 foreach (TSource element in source) {
2424 yield return element;
2426 if (!predicate (element)) {
2427 yield return element;
2433 public static IEnumerable<TSource> SkipWhile<TSource> (
2434 this IQueryable<TSource> source,
2435 Func<TSource, int, bool> predicate)
2437 if (source == null || predicate == null)
2438 throw new ArgumentNullException();
2443 foreach (TSource element in source) {
2445 yield return element;
2447 if (!predicate (element, counter)) {
2448 yield return element;
2459 public static IEnumerable<TResult> Select<TSource, TResult> (
2460 this IQueryable<TSource> source,
2461 Func<TSource, TResult> selector)
2463 if (source == null || selector == null)
2464 throw new ArgumentNullException ();
2466 foreach (TSource element in source)
2467 yield return selector (element);
2470 public static IEnumerable<TResult> Select<TSource, TResult> (
2471 this IQueryable<TSource> source,
2472 Func<TSource, int, TResult> selector)
2474 if (source == null || selector == null)
2475 throw new ArgumentNullException ();
2478 foreach (TSource element in source) {
2479 yield return selector (element, counter);
2488 public static IEnumerable<TResult> SelectMany<TSource, TResult> (
2489 this IQueryable<TSource> source,
2490 Func<TSource, IQueryable<TResult>> selector)
2492 if (source == null || selector == null)
2493 throw new ArgumentNullException ();
2495 foreach (TSource element in source)
2496 foreach (TResult item in selector (element))
2500 public static IEnumerable<TResult> SelectMany<TSource, TResult> (
2501 this IQueryable<TSource> source,
2502 Func<TSource, int, IQueryable<TResult>> selector)
2504 if (source == null || selector == null)
2505 throw new ArgumentNullException ();
2508 foreach (TSource element in source) {
2509 foreach (TResult item in selector (element, counter))
2519 public static bool Any<TSource> (this IQueryable<TSource> source)
2522 throw new ArgumentNullException ();
2524 foreach (TSource element in source)
2529 public static bool Any<TSource> (
2530 this IQueryable<TSource> source,
2531 Func<TSource, bool> predicate)
2533 if (source == null || predicate == null)
2534 throw new ArgumentNullException ();
2536 foreach (TSource element in source)
2537 if (predicate(element))
2546 public static bool All<TSource> (
2547 this IQueryable<TSource> source,
2548 Func<TSource, bool> predicate)
2550 if (source == null || predicate == null)
2551 throw new ArgumentNullException ();
2553 foreach (TSource element in source)
2554 if (!predicate(element))
2563 public static bool Contains<TSource> (this IQueryable<TSource> source, TSource value)
2565 if (source is ICollection<TSource>) {
2566 ICollection<TSource> collection = (ICollection<TSource>)source;
2567 return collection.Contains(value);
2570 foreach (TSource element in source)
2571 if (Equals(element, value))
2581 public static IEnumerable<TSource> Where<TSource> (
2582 this IQueryable<TSource> source,
2583 Func<TSource, bool> predicate)
2585 if (source == null || predicate == null)
2586 throw new ArgumentNullException ();
2588 foreach (TSource element in source)
2589 if (predicate (element))
2590 yield return element;
2593 public static IEnumerable<TSource> Where<TSource> (
2594 this IQueryable<TSource> source,
2595 Func<TSource, int, bool> predicate)
2597 if (source == null || predicate == null)
2598 throw new ArgumentNullException ();
2601 foreach (TSource element in source) {
2602 if (predicate (element, counter))
2603 yield return element;
2612 /* [System.Runtime.CompilerServices.Extension]
2613 public static IQueryable<TSource> Distinct<TSource> (
2614 IQueryable<TSource> source)
2617 throw new ArgumentNullException ();
2619 List<TSource> items = new List<TSource> ();
2620 foreach (TSource element in source) {
2621 if (IndexOf (items, element) == -1) {
2622 items.Add (element);
2623 yield return element;
2632 /* [System.Runtime.CompilerServices.Extension]
2633 public static IQueryable<TSource> Union<TSource> (
2634 IQueryable<TSource> first,
2635 IQueryable<TSource> second)
2637 if (first == null || second == null)
2638 throw new ArgumentNullException ();
2640 List<TSource> items = new List<TSource> ();
2641 foreach (TSource element in first) {
2642 if (IndexOf (items, element) == -1) {
2643 items.Add (element);
2644 yield return element;
2647 foreach (TSource element in second) {
2648 if (IndexOf (items, element) == -1) {
2649 items.Add (element);
2650 yield return element;
2659 /* [System.Runtime.CompilerServices.Extension]
2660 public static IQueryable<TSource> Intersect<TSource> (
2661 IQueryable<TSource> first,
2662 IQueryable<TSource> second)
2664 if (first == null || second == null)
2665 throw new ArgumentNullException ();
2667 List<TSource> items = new List<TSource> (Distinct (first));
2668 bool[] marked = new bool [items.Count];
2669 for (int i = 0; i < marked.Length; i++)
2672 foreach (TSource element in second) {
2673 int index = IndexOf (items, element);
2675 marked [index] = true;
2677 for (int i = 0; i < marked.Length; i++) {
2679 yield return items [i];
2687 /*[System.Runtime.CompilerServices.Extension]
2688 public static IQueryable<TSource> Except<TSource> (
2689 IQueryable<TSource> first,
2690 IQueryable<TSource> second)
2692 if (first == null || second == null)
2693 throw new ArgumentNullException ();
2695 List<TSource> items = new List<TSource> (Distinct (first));
2696 foreach (TSource element in second) {
2697 int index = IndexOf (items, element);
2699 items.Add (element);
2701 items.RemoveAt (index);
2703 foreach (TSource item in items)
2711 public static IEnumerable<V> Join<TSource, U, K, V> (
2712 this IQueryable<TSource> outer,
2713 IQueryable<U> inner,
2714 Func<TSource, K> outerKeySelector,
2715 Func<U, K> innerKeySelector,
2716 Func<TSource, U, V> resultSelector)
2718 if (outer == null || inner == null || outerKeySelector == null ||
2719 innerKeySelector == null || resultSelector == null)
2720 throw new ArgumentNullException ();
2722 /*Lookup<K, U> innerKeys = ToLookup<U, K> (inner, innerKeySelector);
2723 /*Dictionary<K, List<U>> innerKeys = new Dictionary<K, List<U>> ();
2724 foreach (U element in inner)
2726 K innerKey = innerKeySelector (element);
2727 if (!innerKeys.ContainsKey (innerKey))
2728 innerKeys.Add (innerKey, new List<U> ());
2729 innerKeys[innerKey].Add (element);
2732 foreach (TSource element in outer)
2734 K outerKey = outerKeySelector (element);
2735 if (innerKeys.Contains (outerKey))
2737 foreach (U innerElement in innerKeys [outerKey])
2738 yield return resultSelector (element, innerElement);
2741 throw new NotImplementedException ();
2748 /*[System.Runtime.CompilerServices.Extension]
2749 public static IQueryable<V> GroupJoin<TSource, U, K, V> (
2750 IQueryable<TSource> outer,
2751 IQueryable<U> inner,
2752 Func<TSource, K> outerKeySelector,
2753 Func<U, K> innerKeySelector,
2754 Func<TSource, IQueryable<U>, V> resultSelector)
2756 if (outer == null || inner == null || outerKeySelector == null ||
2757 innerKeySelector == null || resultSelector == null)
2758 throw new ArgumentNullException ();
2760 Lookup<K, U> innerKeys = ToLookup<U, K> (inner, innerKeySelector);
2761 /*Dictionary<K, List<U>> innerKeys = new Dictionary<K, List<U>> ();
2762 foreach (U element in inner)
2764 K innerKey = innerKeySelector (element);
2765 if (!innerKeys.ContainsKey (innerKey))
2766 innerKeys.Add (innerKey, new List<U> ());
2767 innerKeys[innerKey].Add (element);
2770 /*foreach (TSource element in outer)
2772 K outerKey = outerKeySelector (element);
2773 if (innerKeys.Contains (outerKey))
2774 yield return resultSelector (element, innerKeys [outerKey]);
2780 // These methods are not included in the
2781 // .NET Standard Query Operators Specification,
2782 // but they provide additional useful commands
2786 private static bool Equals<TSource> (
2787 this TSource first, TSource second)
2789 // Mostly, values in Enumerable<TSource>
2790 // sequences need to be compared using
2791 // Equals and GetHashCode
2793 if (first == null || second == null)
2794 return (first == null && second == null);
2796 return ((first.Equals (second) ||
2797 first.GetHashCode () == second.GetHashCode ()));
2804 [System.Runtime.CompilerServices.Extension]
2805 public static int IndexOf<TSource>(
2806 IQueryable<TSource> source,
2810 foreach (TSource element in source) {
2811 if (Equals(element, item))
2815 // The item was not found