Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Enumerable.cs
Go to the documentation of this file.
5
6namespace System.Linq;
7
8public static class Enumerable
9{
10 private abstract class AppendPrependIterator<TSource> : Iterator<TSource>, IIListProvider<TSource>, IEnumerable<TSource>, IEnumerable
11 {
12 protected readonly IEnumerable<TSource> _source;
13
15
16 public abstract TSource[] ToArray();
17
18 public abstract List<TSource> ToList();
19
20 public abstract int GetCount(bool onlyIfCheap);
21
26
27 protected void GetSourceEnumerator()
28 {
30 }
31
32 public abstract AppendPrependIterator<TSource> Append(TSource item);
33
35
36 protected bool LoadFromEnumerator()
37 {
39 {
41 return true;
42 }
43 Dispose();
44 return false;
45 }
46
47 public override void Dispose()
48 {
49 if (_enumerator != null)
50 {
51 _enumerator.Dispose();
52 _enumerator = null;
53 }
54 base.Dispose();
55 }
56 }
57
58 private sealed class AppendPrepend1Iterator<TSource> : AppendPrependIterator<TSource>
59 {
60 private readonly TSource _item;
61
62 private readonly bool _appending;
63
64 private TSource[] LazyToArray()
65 {
67 if (!_appending)
68 {
69 largeArrayBuilder.SlowAdd(_item);
70 }
72 if (_appending)
73 {
74 largeArrayBuilder.SlowAdd(_item);
75 }
76 return largeArrayBuilder.ToArray();
77 }
78
79 public override TSource[] ToArray()
80 {
81 int count = GetCount(onlyIfCheap: true);
82 if (count == -1)
83 {
84 return LazyToArray();
85 }
86 TSource[] array = new TSource[count];
87 int arrayIndex;
88 if (_appending)
89 {
90 arrayIndex = 0;
91 }
92 else
93 {
94 array[0] = _item;
95 arrayIndex = 1;
96 }
98 if (_appending)
99 {
100 array[^1] = _item;
101 }
102 return array;
103 }
104
105 public override List<TSource> ToList()
106 {
107 int count = GetCount(onlyIfCheap: true);
108 List<TSource> list = ((count == -1) ? new List<TSource>() : new List<TSource>(count));
109 if (!_appending)
110 {
111 list.Add(_item);
112 }
114 if (_appending)
115 {
116 list.Add(_item);
117 }
118 return list;
119 }
120
121 public override int GetCount(bool onlyIfCheap)
122 {
124 {
125 int count = iIListProvider.GetCount(onlyIfCheap);
126 if (count != -1)
127 {
128 return count + 1;
129 }
130 return -1;
131 }
133 {
134 return -1;
135 }
136 return _source.Count() + 1;
137 }
138
145
146 public override Iterator<TSource> Clone()
147 {
149 }
150
151 public override bool MoveNext()
152 {
153 switch (_state)
154 {
155 case 1:
156 _state = 2;
157 if (!_appending)
158 {
159 _current = _item;
160 return true;
161 }
162 goto case 2;
163 case 2:
165 _state = 3;
166 goto case 3;
167 case 3:
168 if (LoadFromEnumerator())
169 {
170 return true;
171 }
172 if (_appending)
173 {
174 _current = _item;
175 return true;
176 }
177 break;
178 }
179 Dispose();
180 return false;
181 }
182
184 {
185 if (_appending)
186 {
188 }
190 }
191
193 {
194 if (_appending)
195 {
197 }
199 }
200 }
201
202 private sealed class AppendPrependN<TSource> : AppendPrependIterator<TSource>
203 {
205
207
208 private readonly int _prependCount;
209
210 private readonly int _appendCount;
211
213
214 private TSource[] LazyToArray()
215 {
217 if (_prepended != null)
218 {
220 }
222 if (_appended != null)
223 {
225 }
226 TSource[] array = sparseArrayBuilder.ToArray();
227 int num = 0;
229 {
230 array[num++] = singleLinkedNode.Item;
231 }
232 num = array.Length - 1;
234 {
235 array[num--] = singleLinkedNode2.Item;
236 }
237 return array;
238 }
239
240 public override TSource[] ToArray()
241 {
242 int count = GetCount(onlyIfCheap: true);
243 if (count == -1)
244 {
245 return LazyToArray();
246 }
247 TSource[] array = new TSource[count];
248 int num = 0;
250 {
251 array[num] = singleLinkedNode.Item;
252 num++;
253 }
255 {
256 collection.CopyTo(array, num);
257 }
258 else
259 {
260 foreach (TSource item in _source)
261 {
262 array[num] = item;
263 num++;
264 }
265 }
266 num = array.Length;
268 {
269 num--;
270 array[num] = singleLinkedNode2.Item;
271 }
272 return array;
273 }
274
275 public override List<TSource> ToList()
276 {
277 int count = GetCount(onlyIfCheap: true);
278 List<TSource> list = ((count == -1) ? new List<TSource>() : new List<TSource>(count));
280 {
282 }
284 if (_appended != null)
285 {
287 }
288 return list;
289 }
290
291 public override int GetCount(bool onlyIfCheap)
292 {
294 {
295 int count = iIListProvider.GetCount(onlyIfCheap);
296 if (count != -1)
297 {
299 }
300 return -1;
301 }
303 {
304 return -1;
305 }
306 return _source.Count() + _appendCount + _prependCount;
307 }
308
317
322
323 public override bool MoveNext()
324 {
325 switch (_state)
326 {
327 case 1:
329 _state = 2;
330 goto case 2;
331 case 2:
332 if (_node != null)
333 {
334 _current = _node.Item;
335 _node = _node.Linked;
336 return true;
337 }
339 _state = 3;
340 goto case 3;
341 case 3:
342 if (LoadFromEnumerator())
343 {
344 return true;
345 }
346 if (_appended == null)
347 {
348 return false;
349 }
351 _state = 4;
352 goto case 4;
353 case 4:
354 return LoadFromEnumerator();
355 default:
356 Dispose();
357 return false;
358 }
359 }
360
366
372 }
373
374 private sealed class Concat2Iterator<TSource> : ConcatIterator<TSource>
375 {
376 internal readonly IEnumerable<TSource> _first;
377
378 internal readonly IEnumerable<TSource> _second;
379
380 public override int GetCount(bool onlyIfCheap)
381 {
382 if (!_first.TryGetNonEnumeratedCount(out var count))
383 {
384 if (onlyIfCheap)
385 {
386 return -1;
387 }
388 count = _first.Count();
389 }
390 if (!_second.TryGetNonEnumeratedCount(out var count2))
391 {
392 if (onlyIfCheap)
393 {
394 return -1;
395 }
396 count2 = _second.Count();
397 }
398 return checked(count + count2);
399 }
400
401 public override TSource[] ToArray()
402 {
404 bool flag = sparseArrayBuilder.ReserveOrAdd(_first);
405 bool flag2 = sparseArrayBuilder.ReserveOrAdd(_second);
406 TSource[] array = sparseArrayBuilder.ToArray();
407 if (flag)
408 {
409 Marker marker = sparseArrayBuilder.Markers.First();
411 }
412 if (flag2)
413 {
414 Marker marker2 = sparseArrayBuilder.Markers.Last();
416 }
417 return array;
418 }
419
425
426 public override Iterator<TSource> Clone()
427 {
429 }
430
436
438 {
439 return index switch
440 {
441 0 => _first,
442 1 => _second,
443 _ => null,
444 };
445 }
446 }
447
448 private sealed class ConcatNIterator<TSource> : ConcatIterator<TSource>
449 {
451
452 private readonly IEnumerable<TSource> _head;
453
454 private readonly int _headIndex;
455
456 private readonly bool _hasOnlyCollections;
457
459
460 public override int GetCount(bool onlyIfCheap)
461 {
463 {
464 return -1;
465 }
466 int num = 0;
468 checked
469 {
471 do
472 {
475 int num2 = ((head is ICollection<TSource> collection) ? collection.Count : head.Count());
476 num += num2;
477 }
478 while ((concatNIterator = concatNIterator2.PreviousN) != null);
479 return num + concatNIterator2._tail.GetCount(onlyIfCheap);
480 }
481 }
482
483 public override TSource[] ToArray()
484 {
486 {
487 return LazyToArray();
488 }
489 return PreallocatingToArray();
490 }
491
492 private TSource[] LazyToArray()
493 {
496 int num = 0;
497 while (true)
498 {
500 if (enumerable == null)
501 {
502 break;
503 }
504 if (sparseArrayBuilder.ReserveOrAdd(enumerable))
505 {
506 arrayBuilder.Add(num);
507 }
508 num++;
509 }
510 TSource[] array = sparseArrayBuilder.ToArray();
512 for (int i = 0; i < markers.Count; i++)
513 {
514 Marker marker = markers[i];
517 }
518 return array;
519 }
520
521 private TSource[] PreallocatingToArray()
522 {
523 int count = GetCount(onlyIfCheap: true);
524 if (count == 0)
525 {
526 return Array.Empty<TSource>();
527 }
528 TSource[] array = new TSource[count];
529 int num = array.Length;
531 checked
532 {
534 do
535 {
538 int count2 = collection.Count;
539 if (count2 > 0)
540 {
541 num -= count2;
542 collection.CopyTo(array, num);
543 }
544 }
545 while ((concatNIterator = concatNIterator2.PreviousN) != null);
549 if (count3 > 0)
550 {
552 }
553 if (num > count3)
554 {
557 }
558 return array;
559 }
560 }
561
569
574
576 {
577 if (_headIndex == 2147483645)
578 {
579 return new Concat2Iterator<TSource>(this, next);
580 }
582 return new ConcatNIterator<TSource>(this, next, _headIndex + 1, hasOnlyCollections);
583 }
584
586 {
587 if (index > _headIndex)
588 {
589 return null;
590 }
593 do
594 {
596 if (index == concatNIterator2._headIndex)
597 {
598 return concatNIterator2._head;
599 }
600 }
601 while ((concatNIterator = concatNIterator2.PreviousN) != null);
602 return concatNIterator2._tail.GetEnumerable(index);
603 }
604 }
605
606 private abstract class ConcatIterator<TSource> : Iterator<TSource>, IIListProvider<TSource>, IEnumerable<TSource>, IEnumerable
607 {
609
610 public abstract int GetCount(bool onlyIfCheap);
611
612 public abstract TSource[] ToArray();
613
615 {
616 int count = GetCount(onlyIfCheap: true);
617 List<TSource> list = ((count != -1) ? new List<TSource>(count) : new List<TSource>());
618 int num = 0;
619 while (true)
620 {
622 if (enumerable == null)
623 {
624 break;
625 }
626 list.AddRange(enumerable);
627 num++;
628 }
629 return list;
630 }
631
632 public override void Dispose()
633 {
634 if (_enumerator != null)
635 {
636 _enumerator.Dispose();
637 _enumerator = null;
638 }
639 base.Dispose();
640 }
641
643
645
646 public override bool MoveNext()
647 {
648 if (_state == 1)
649 {
651 _state = 2;
652 }
653 if (_state > 1)
654 {
655 while (true)
656 {
657 if (_enumerator.MoveNext())
658 {
660 return true;
661 }
663 if (enumerable == null)
664 {
665 break;
666 }
667 _enumerator.Dispose();
668 _enumerator = enumerable.GetEnumerator();
669 }
670 Dispose();
671 }
672 return false;
673 }
674 }
675
676 private sealed class DefaultIfEmptyIterator<TSource> : Iterator<TSource>, IIListProvider<TSource>, IEnumerable<TSource>, IEnumerable
677 {
679
680 private readonly TSource _default;
681
683
684 public TSource[] ToArray()
685 {
686 TSource[] array = _source.ToArray();
687 if (array.Length != 0)
688 {
689 return array;
690 }
691 return new TSource[1] { _default };
692 }
693
695 {
696 List<TSource> list = _source.ToList();
697 if (list.Count == 0)
698 {
699 list.Add(_default);
700 }
701 return list;
702 }
703
704 public int GetCount(bool onlyIfCheap)
705 {
707 if (num != 0)
708 {
709 return num;
710 }
711 return 1;
712 }
713
719
720 public override Iterator<TSource> Clone()
721 {
723 }
724
725 public override bool MoveNext()
726 {
727 switch (_state)
728 {
729 case 1:
731 if (_enumerator.MoveNext())
732 {
734 _state = 2;
735 }
736 else
737 {
739 _state = -1;
740 }
741 return true;
742 case 2:
743 if (_enumerator.MoveNext())
744 {
746 return true;
747 }
748 break;
749 }
750 Dispose();
751 return false;
752 }
753
754 public override void Dispose()
755 {
756 if (_enumerator != null)
757 {
758 _enumerator.Dispose();
759 _enumerator = null;
760 }
761 base.Dispose();
762 }
763 }
764
765 private sealed class DistinctIterator<TSource> : Iterator<TSource>, IIListProvider<TSource>, IEnumerable<TSource>, IEnumerable
766 {
768
770
772
774
775 public TSource[] ToArray()
776 {
778 }
779
781 {
783 }
784
785 public int GetCount(bool onlyIfCheap)
786 {
787 if (!onlyIfCheap)
788 {
790 }
791 return -1;
792 }
793
799
800 public override Iterator<TSource> Clone()
801 {
803 }
804
805 public override bool MoveNext()
806 {
807 int state = _state;
808 TSource current;
809 if (state != 1)
810 {
811 if (state == 2)
812 {
813 while (_enumerator.MoveNext())
814 {
815 current = _enumerator.Current;
816 if (_set.Add(current))
817 {
818 _current = current;
819 return true;
820 }
821 }
822 }
823 Dispose();
824 return false;
825 }
827 if (!_enumerator.MoveNext())
828 {
829 Dispose();
830 return false;
831 }
832 current = _enumerator.Current;
834 _set.Add(current);
835 _current = current;
836 _state = 2;
837 return true;
838 }
839
840 public override void Dispose()
841 {
842 if (_enumerator != null)
843 {
844 _enumerator.Dispose();
845 _enumerator = null;
846 _set = null;
847 }
848 base.Dispose();
849 }
850 }
851
852 [DebuggerDisplay("Count = {Count}")]
853 private sealed class ListPartition<TSource> : Iterator<TSource>, IPartition<TSource>, IIListProvider<TSource>, IEnumerable<TSource>, IEnumerable
854 {
855 private readonly IList<TSource> _source;
856
857 private readonly int _minIndexInclusive;
858
859 private readonly int _maxIndexInclusive;
860
861 private int Count
862 {
863 get
864 {
865 int count = _source.Count;
867 {
868 return 0;
869 }
871 }
872 }
873
880
885
886 public override bool MoveNext()
887 {
888 int num = _state - 1;
889 if ((uint)num <= (uint)(_maxIndexInclusive - _minIndexInclusive) && num < _source.Count - _minIndexInclusive)
890 {
892 _state++;
893 return true;
894 }
895 Dispose();
896 return false;
897 }
898
903
905 {
906 int num = _minIndexInclusive + count;
907 if ((uint)num <= (uint)_maxIndexInclusive)
908 {
910 }
911 return EmptyPartition<TSource>.Instance;
912 }
913
915 {
916 int num = _minIndexInclusive + count - 1;
917 if ((uint)num < (uint)_maxIndexInclusive)
918 {
920 }
921 return this;
922 }
923
924 public TSource TryGetElementAt(int index, out bool found)
925 {
927 {
928 found = true;
930 }
931 found = false;
932 return default(TSource);
933 }
934
935 public TSource TryGetFirst(out bool found)
936 {
937 if (_source.Count > _minIndexInclusive)
938 {
939 found = true;
941 }
942 found = false;
943 return default(TSource);
944 }
945
946 public TSource TryGetLast(out bool found)
947 {
948 int num = _source.Count - 1;
949 if (num >= _minIndexInclusive)
950 {
951 found = true;
952 return _source[Math.Min(num, _maxIndexInclusive)];
953 }
954 found = false;
955 return default(TSource);
956 }
957
958 public TSource[] ToArray()
959 {
960 int count = Count;
961 if (count == 0)
962 {
963 return Array.Empty<TSource>();
964 }
965 TSource[] array = new TSource[count];
966 int num = 0;
968 while (num != array.Length)
969 {
970 array[num] = _source[num2];
971 num++;
972 num2++;
973 }
974 return array;
975 }
976
978 {
979 int count = Count;
980 if (count == 0)
981 {
982 return new List<TSource>();
983 }
985 int num = _minIndexInclusive + count;
986 for (int i = _minIndexInclusive; i != num; i++)
987 {
988 list.Add(_source[i]);
989 }
990 return list;
991 }
992
993 public int GetCount(bool onlyIfCheap)
994 {
995 return Count;
996 }
997 }
998
999 private sealed class EnumerablePartition<TSource> : Iterator<TSource>, IPartition<TSource>, IIListProvider<TSource>, IEnumerable<TSource>, IEnumerable
1000 {
1002
1003 private readonly int _minIndexInclusive;
1004
1005 private readonly int _maxIndexInclusive;
1006
1008
1009 private bool HasLimit => _maxIndexInclusive != -1;
1010
1012
1019
1024
1025 public override void Dispose()
1026 {
1027 if (_enumerator != null)
1028 {
1029 _enumerator.Dispose();
1030 _enumerator = null;
1031 }
1032 base.Dispose();
1033 }
1034
1035 public int GetCount(bool onlyIfCheap)
1036 {
1037 if (onlyIfCheap)
1038 {
1039 return -1;
1040 }
1041 if (!HasLimit)
1042 {
1043 return Math.Max(_source.Count() - _minIndexInclusive, 0);
1044 }
1045 using IEnumerator<TSource> en = _source.GetEnumerator();
1046 uint num = SkipAndCount((uint)(_maxIndexInclusive + 1), en);
1047 return Math.Max((int)num - _minIndexInclusive, 0);
1048 }
1049
1050 public override bool MoveNext()
1051 {
1052 int num = _state - 3;
1053 if (num < -2)
1054 {
1055 Dispose();
1056 return false;
1057 }
1058 int state = _state;
1059 if (state != 1)
1060 {
1061 if (state != 2)
1062 {
1063 goto IL_0054;
1064 }
1065 }
1066 else
1067 {
1069 _state = 2;
1070 }
1072 {
1073 _state = 3;
1074 goto IL_0054;
1075 }
1076 goto IL_009b;
1077 IL_009b:
1078 Dispose();
1079 return false;
1080 IL_0054:
1081 if ((!HasLimit || num < Limit) && _enumerator.MoveNext())
1082 {
1083 if (HasLimit)
1084 {
1085 _state++;
1086 }
1088 return true;
1089 }
1090 goto IL_009b;
1091 }
1092
1097
1099 {
1100 int num = _minIndexInclusive + count;
1101 if (!HasLimit)
1102 {
1103 if (num < 0)
1104 {
1105 return new EnumerablePartition<TSource>(this, count, -1);
1106 }
1107 }
1108 else if ((uint)num > (uint)_maxIndexInclusive)
1109 {
1110 return EmptyPartition<TSource>.Instance;
1111 }
1113 }
1114
1116 {
1117 int num = _minIndexInclusive + count - 1;
1118 if (!HasLimit)
1119 {
1120 if (num < 0)
1121 {
1122 return new EnumerablePartition<TSource>(this, 0, count - 1);
1123 }
1124 }
1125 else if ((uint)num >= (uint)_maxIndexInclusive)
1126 {
1127 return this;
1128 }
1130 }
1131
1132 public TSource TryGetElementAt(int index, out bool found)
1133 {
1134 if (index >= 0 && (!HasLimit || index < Limit))
1135 {
1136 using IEnumerator<TSource> enumerator = _source.GetEnumerator();
1138 {
1139 found = true;
1140 return enumerator.Current;
1141 }
1142 }
1143 found = false;
1144 return default(TSource);
1145 }
1146
1147 public TSource TryGetFirst(out bool found)
1148 {
1150 {
1151 if (SkipBeforeFirst(enumerator) && enumerator.MoveNext())
1152 {
1153 found = true;
1154 return enumerator.Current;
1155 }
1156 }
1157 found = false;
1158 return default(TSource);
1159 }
1160
1161 public TSource TryGetLast(out bool found)
1162 {
1164 {
1165 if (SkipBeforeFirst(enumerator) && enumerator.MoveNext())
1166 {
1167 int num = Limit - 1;
1168 int num2 = ((!HasLimit) ? int.MinValue : 0);
1169 TSource current;
1170 do
1171 {
1172 num--;
1173 current = enumerator.Current;
1174 }
1175 while (num >= num2 && enumerator.MoveNext());
1176 found = true;
1177 return current;
1178 }
1179 }
1180 found = false;
1181 return default(TSource);
1182 }
1183
1184 public TSource[] ToArray()
1185 {
1187 {
1188 if (SkipBeforeFirst(enumerator) && enumerator.MoveNext())
1189 {
1190 int num = Limit - 1;
1191 int num2 = ((!HasLimit) ? int.MinValue : 0);
1192 int maxCapacity = (HasLimit ? Limit : int.MaxValue);
1194 do
1195 {
1196 num--;
1198 }
1199 while (num >= num2 && enumerator.MoveNext());
1200 return largeArrayBuilder.ToArray();
1201 }
1202 }
1203 return Array.Empty<TSource>();
1204 }
1205
1207 {
1210 {
1211 if (SkipBeforeFirst(enumerator) && enumerator.MoveNext())
1212 {
1213 int num = Limit - 1;
1214 int num2 = ((!HasLimit) ? int.MinValue : 0);
1215 do
1216 {
1217 num--;
1218 list.Add(enumerator.Current);
1219 }
1220 while (num >= num2 && enumerator.MoveNext());
1221 }
1222 }
1223 return list;
1224 }
1225
1227 {
1229 }
1230
1231 private static bool SkipBefore(int index, IEnumerator<TSource> en)
1232 {
1233 return SkipAndCount(index, en) == index;
1234 }
1235
1237 {
1238 return (int)SkipAndCount((uint)index, en);
1239 }
1240
1241 private static uint SkipAndCount(uint index, IEnumerator<TSource> en)
1242 {
1243 for (uint num = 0u; num < index; num++)
1244 {
1245 if (!en.MoveNext())
1246 {
1247 return num;
1248 }
1249 }
1250 return index;
1251 }
1252 }
1253
1254 [DebuggerDisplay("Count = {CountForDebugger}")]
1255 private sealed class RangeIterator : Iterator<int>, IPartition<int>, IIListProvider<int>, IEnumerable<int>, IEnumerable
1256 {
1257 private readonly int _start;
1258
1259 private readonly int _end;
1260
1261 private int CountForDebugger => _end - _start;
1262
1267
1268 public int[] ToArray()
1269 {
1270 int[] array = new int[_end - _start];
1271 int num = _start;
1272 for (int i = 0; i != array.Length; i++)
1273 {
1274 array[i] = num;
1275 num++;
1276 }
1277 return array;
1278 }
1279
1281 {
1283 for (int i = _start; i != _end; i++)
1284 {
1285 list.Add(i);
1286 }
1287 return list;
1288 }
1289
1290 public int GetCount(bool onlyIfCheap)
1291 {
1292 return _end - _start;
1293 }
1294
1296 {
1297 if (count >= _end - _start)
1298 {
1299 return EmptyPartition<int>.Instance;
1300 }
1301 return new RangeIterator(_start + count, _end - _start - count);
1302 }
1303
1305 {
1306 int num = _end - _start;
1307 if (count >= num)
1308 {
1309 return this;
1310 }
1311 return new RangeIterator(_start, count);
1312 }
1313
1314 public int TryGetElementAt(int index, out bool found)
1315 {
1316 if ((uint)index < (uint)(_end - _start))
1317 {
1318 found = true;
1319 return _start + index;
1320 }
1321 found = false;
1322 return 0;
1323 }
1324
1325 public int TryGetFirst(out bool found)
1326 {
1327 found = true;
1328 return _start;
1329 }
1330
1331 public int TryGetLast(out bool found)
1332 {
1333 found = true;
1334 return _end - 1;
1335 }
1336
1337 public RangeIterator(int start, int count)
1338 {
1339 _start = start;
1340 _end = start + count;
1341 }
1342
1343 public override Iterator<int> Clone()
1344 {
1345 return new RangeIterator(_start, _end - _start);
1346 }
1347
1348 public override bool MoveNext()
1349 {
1350 switch (_state)
1351 {
1352 case 1:
1353 _current = _start;
1354 _state = 2;
1355 return true;
1356 case 2:
1357 if (++_current != _end)
1358 {
1359 return true;
1360 }
1361 break;
1362 }
1363 _state = -1;
1364 return false;
1365 }
1366
1367 public override void Dispose()
1368 {
1369 _state = -1;
1370 }
1371 }
1372
1373 [DebuggerDisplay("Count = {_count}")]
1374 private sealed class RepeatIterator<TResult> : Iterator<TResult>, IPartition<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable
1375 {
1376 private readonly int _count;
1377
1382
1383 public TResult[] ToArray()
1384 {
1385 TResult[] array = new TResult[_count];
1386 if (_current != null)
1387 {
1388 Array.Fill(array, _current);
1389 }
1390 return array;
1391 }
1392
1394 {
1396 for (int i = 0; i != _count; i++)
1397 {
1398 list.Add(_current);
1399 }
1400 return list;
1401 }
1402
1403 public int GetCount(bool onlyIfCheap)
1404 {
1405 return _count;
1406 }
1407
1409 {
1410 if (count >= _count)
1411 {
1412 return EmptyPartition<TResult>.Instance;
1413 }
1415 }
1416
1418 {
1419 if (count >= _count)
1420 {
1421 return this;
1422 }
1424 }
1425
1427 {
1428 if ((uint)index < (uint)_count)
1429 {
1430 found = true;
1431 return _current;
1432 }
1433 found = false;
1434 return default(TResult);
1435 }
1436
1438 {
1439 found = true;
1440 return _current;
1441 }
1442
1444 {
1445 found = true;
1446 return _current;
1447 }
1448
1449 public RepeatIterator(TResult element, int count)
1450 {
1451 _current = element;
1452 _count = count;
1453 }
1454
1455 public override Iterator<TResult> Clone()
1456 {
1458 }
1459
1460 public override void Dispose()
1461 {
1462 _state = -1;
1463 }
1464
1465 public override bool MoveNext()
1466 {
1467 int num = _state - 1;
1468 if (num >= 0 && num != _count)
1469 {
1470 _state++;
1471 return true;
1472 }
1473 Dispose();
1474 return false;
1475 }
1476 }
1477
1478 private sealed class ReverseIterator<TSource> : Iterator<TSource>, IIListProvider<TSource>, IEnumerable<TSource>, IEnumerable
1479 {
1481
1482 private TSource[] _buffer;
1483
1484 public TSource[] ToArray()
1485 {
1486 TSource[] array = _source.ToArray();
1488 return array;
1489 }
1490
1492 {
1493 List<TSource> list = _source.ToList();
1494 list.Reverse();
1495 return list;
1496 }
1497
1498 public int GetCount(bool onlyIfCheap)
1499 {
1500 if (onlyIfCheap)
1501 {
1504 {
1505 if (!(source is ICollection<TSource> { Count: var count }))
1506 {
1507 if (!(source is ICollection { Count: var count2 }))
1508 {
1509 return -1;
1510 }
1511 return count2;
1512 }
1513 return count;
1514 }
1515 return iIListProvider.GetCount(onlyIfCheap: true);
1516 }
1517 return _source.Count();
1518 }
1519
1524
1525 public override Iterator<TSource> Clone()
1526 {
1528 }
1529
1530 public override bool MoveNext()
1531 {
1532 if (_state - 2 <= -2)
1533 {
1534 Dispose();
1535 return false;
1536 }
1537 int state = _state;
1538 if (state == 1)
1539 {
1541 _buffer = buffer._items;
1542 _state = buffer._count + 2;
1543 }
1544 int num = _state - 3;
1545 if (num != -1)
1546 {
1547 _current = _buffer[num];
1548 _state--;
1549 return true;
1550 }
1551 Dispose();
1552 return false;
1553 }
1554
1555 public override void Dispose()
1556 {
1557 _buffer = null;
1558 base.Dispose();
1559 }
1560 }
1561
1562 private sealed class SelectEnumerableIterator<TSource, TResult> : Iterator<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable
1563 {
1565
1567
1569
1570 public TResult[] ToArray()
1571 {
1573 foreach (TSource item in _source)
1574 {
1576 }
1577 return largeArrayBuilder.ToArray();
1578 }
1579
1581 {
1583 foreach (TSource item in _source)
1584 {
1585 list.Add(_selector(item));
1586 }
1587 return list;
1588 }
1589
1590 public int GetCount(bool onlyIfCheap)
1591 {
1592 if (onlyIfCheap)
1593 {
1594 return -1;
1595 }
1596 int num = 0;
1597 foreach (TSource item in _source)
1598 {
1599 _selector(item);
1600 num = checked(num + 1);
1601 }
1602 return num;
1603 }
1604
1610
1611 public override Iterator<TResult> Clone()
1612 {
1614 }
1615
1616 public override void Dispose()
1617 {
1618 if (_enumerator != null)
1619 {
1620 _enumerator.Dispose();
1621 _enumerator = null;
1622 }
1623 base.Dispose();
1624 }
1625
1626 public override bool MoveNext()
1627 {
1628 int state = _state;
1629 if (state != 1)
1630 {
1631 if (state != 2)
1632 {
1633 goto IL_005a;
1634 }
1635 }
1636 else
1637 {
1639 _state = 2;
1640 }
1641 if (_enumerator.MoveNext())
1642 {
1644 return true;
1645 }
1646 Dispose();
1647 goto IL_005a;
1648 IL_005a:
1649 return false;
1650 }
1651
1656 }
1657
1658 [DebuggerDisplay("Count = {CountForDebugger}")]
1659 private sealed class SelectArrayIterator<TSource, TResult> : Iterator<TResult>, IPartition<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable
1660 {
1661 private readonly TSource[] _source;
1662
1664
1665 private int CountForDebugger => _source.Length;
1666
1667 public TResult[] ToArray()
1668 {
1669 TResult[] array = new TResult[_source.Length];
1670 for (int i = 0; i < array.Length; i++)
1671 {
1672 array[i] = _selector(_source[i]);
1673 }
1674 return array;
1675 }
1676
1678 {
1679 TSource[] source = _source;
1680 List<TResult> list = new List<TResult>(source.Length);
1681 for (int i = 0; i < source.Length; i++)
1682 {
1683 list.Add(_selector(source[i]));
1684 }
1685 return list;
1686 }
1687
1688 public int GetCount(bool onlyIfCheap)
1689 {
1690 if (!onlyIfCheap)
1691 {
1692 TSource[] source = _source;
1693 foreach (TSource arg in source)
1694 {
1695 _selector(arg);
1696 }
1697 }
1698 return _source.Length;
1699 }
1700
1702 {
1703 if (count >= _source.Length)
1704 {
1705 return EmptyPartition<TResult>.Instance;
1706 }
1708 }
1709
1711 {
1712 if (count < _source.Length)
1713 {
1715 }
1716 return this;
1717 }
1718
1720 {
1721 if ((uint)index < (uint)_source.Length)
1722 {
1723 found = true;
1724 return _selector(_source[index]);
1725 }
1726 found = false;
1727 return default(TResult);
1728 }
1729
1731 {
1732 found = true;
1733 return _selector(_source[0]);
1734 }
1735
1737 {
1738 found = true;
1739 return _selector(_source[_source.Length - 1]);
1740 }
1741
1747
1748 public override Iterator<TResult> Clone()
1749 {
1751 }
1752
1753 public override bool MoveNext()
1754 {
1755 if ((_state < 1) | (_state == _source.Length + 1))
1756 {
1757 Dispose();
1758 return false;
1759 }
1760 int num = _state++ - 1;
1761 _current = _selector(_source[num]);
1762 return true;
1763 }
1764
1769 }
1770
1771 private sealed class SelectRangeIterator<TResult> : Iterator<TResult>, IPartition<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable
1772 {
1773 private readonly int _start;
1774
1775 private readonly int _end;
1776
1778
1780 {
1781 _start = start;
1782 _end = end;
1784 }
1785
1786 public override Iterator<TResult> Clone()
1787 {
1789 }
1790
1791 public override bool MoveNext()
1792 {
1793 if (_state < 1 || _state == _end - _start + 1)
1794 {
1795 Dispose();
1796 return false;
1797 }
1798 int num = _state++ - 1;
1799 _current = _selector(_start + num);
1800 return true;
1801 }
1802
1807
1808 public TResult[] ToArray()
1809 {
1810 TResult[] array = new TResult[_end - _start];
1811 int start = _start;
1812 for (int i = 0; i < array.Length; i++)
1813 {
1814 array[i] = _selector(start++);
1815 }
1816 return array;
1817 }
1818
1820 {
1822 for (int i = _start; i != _end; i++)
1823 {
1824 list.Add(_selector(i));
1825 }
1826 return list;
1827 }
1828
1829 public int GetCount(bool onlyIfCheap)
1830 {
1831 if (!onlyIfCheap)
1832 {
1833 for (int i = _start; i != _end; i++)
1834 {
1835 _selector(i);
1836 }
1837 }
1838 return _end - _start;
1839 }
1840
1842 {
1843 if (count >= _end - _start)
1844 {
1845 return EmptyPartition<TResult>.Instance;
1846 }
1848 }
1849
1851 {
1852 if (count >= _end - _start)
1853 {
1854 return this;
1855 }
1857 }
1858
1860 {
1861 if ((uint)index < (uint)(_end - _start))
1862 {
1863 found = true;
1864 return _selector(_start + index);
1865 }
1866 found = false;
1867 return default(TResult);
1868 }
1869
1871 {
1872 found = true;
1873 return _selector(_start);
1874 }
1875
1877 {
1878 found = true;
1879 return _selector(_end - 1);
1880 }
1881 }
1882
1883 [DebuggerDisplay("Count = {CountForDebugger}")]
1884 private sealed class SelectListIterator<TSource, TResult> : Iterator<TResult>, IPartition<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable
1885 {
1886 private readonly List<TSource> _source;
1887
1889
1891
1893
1894 public TResult[] ToArray()
1895 {
1896 int count = _source.Count;
1897 if (count == 0)
1898 {
1899 return Array.Empty<TResult>();
1900 }
1901 TResult[] array = new TResult[count];
1902 for (int i = 0; i < array.Length; i++)
1903 {
1904 array[i] = _selector(_source[i]);
1905 }
1906 return array;
1907 }
1908
1910 {
1911 int count = _source.Count;
1913 for (int i = 0; i < count; i++)
1914 {
1915 list.Add(_selector(_source[i]));
1916 }
1917 return list;
1918 }
1919
1920 public int GetCount(bool onlyIfCheap)
1921 {
1922 int count = _source.Count;
1923 if (!onlyIfCheap)
1924 {
1925 for (int i = 0; i < count; i++)
1926 {
1927 _selector(_source[i]);
1928 }
1929 }
1930 return count;
1931 }
1932
1934 {
1936 }
1937
1942
1944 {
1945 if ((uint)index < (uint)_source.Count)
1946 {
1947 found = true;
1948 return _selector(_source[index]);
1949 }
1950 found = false;
1951 return default(TResult);
1952 }
1953
1955 {
1956 if (_source.Count != 0)
1957 {
1958 found = true;
1959 return _selector(_source[0]);
1960 }
1961 found = false;
1962 return default(TResult);
1963 }
1964
1966 {
1967 int count = _source.Count;
1968 if (count != 0)
1969 {
1970 found = true;
1971 return _selector(_source[count - 1]);
1972 }
1973 found = false;
1974 return default(TResult);
1975 }
1976
1982
1983 public override Iterator<TResult> Clone()
1984 {
1986 }
1987
1988 public override bool MoveNext()
1989 {
1990 int state = _state;
1991 if (state != 1)
1992 {
1993 if (state != 2)
1994 {
1995 goto IL_005a;
1996 }
1997 }
1998 else
1999 {
2001 _state = 2;
2002 }
2003 if (_enumerator.MoveNext())
2004 {
2005 _current = _selector(_enumerator.Current);
2006 return true;
2007 }
2008 Dispose();
2009 goto IL_005a;
2010 IL_005a:
2011 return false;
2012 }
2013
2018 }
2019
2020 [DebuggerDisplay("Count = {CountForDebugger}")]
2021 private sealed class SelectIListIterator<TSource, TResult> : Iterator<TResult>, IPartition<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable
2022 {
2023 private readonly IList<TSource> _source;
2024
2026
2028
2029 private int CountForDebugger => _source.Count;
2030
2031 public TResult[] ToArray()
2032 {
2033 int count = _source.Count;
2034 if (count == 0)
2035 {
2036 return Array.Empty<TResult>();
2037 }
2038 TResult[] array = new TResult[count];
2039 for (int i = 0; i < array.Length; i++)
2040 {
2041 array[i] = _selector(_source[i]);
2042 }
2043 return array;
2044 }
2045
2047 {
2048 int count = _source.Count;
2050 for (int i = 0; i < count; i++)
2051 {
2052 list.Add(_selector(_source[i]));
2053 }
2054 return list;
2055 }
2056
2057 public int GetCount(bool onlyIfCheap)
2058 {
2059 int count = _source.Count;
2060 if (!onlyIfCheap)
2061 {
2062 for (int i = 0; i < count; i++)
2063 {
2064 _selector(_source[i]);
2065 }
2066 }
2067 return count;
2068 }
2069
2071 {
2073 }
2074
2079
2081 {
2082 if ((uint)index < (uint)_source.Count)
2083 {
2084 found = true;
2085 return _selector(_source[index]);
2086 }
2087 found = false;
2088 return default(TResult);
2089 }
2090
2092 {
2093 if (_source.Count != 0)
2094 {
2095 found = true;
2096 return _selector(_source[0]);
2097 }
2098 found = false;
2099 return default(TResult);
2100 }
2101
2103 {
2104 int count = _source.Count;
2105 if (count != 0)
2106 {
2107 found = true;
2108 return _selector(_source[count - 1]);
2109 }
2110 found = false;
2111 return default(TResult);
2112 }
2113
2119
2120 public override Iterator<TResult> Clone()
2121 {
2123 }
2124
2125 public override bool MoveNext()
2126 {
2127 int state = _state;
2128 if (state != 1)
2129 {
2130 if (state != 2)
2131 {
2132 goto IL_005a;
2133 }
2134 }
2135 else
2136 {
2137 _enumerator = _source.GetEnumerator();
2138 _state = 2;
2139 }
2140 if (_enumerator.MoveNext())
2141 {
2143 return true;
2144 }
2145 Dispose();
2146 goto IL_005a;
2147 IL_005a:
2148 return false;
2149 }
2150
2151 public override void Dispose()
2152 {
2153 if (_enumerator != null)
2154 {
2155 _enumerator.Dispose();
2156 _enumerator = null;
2157 }
2158 base.Dispose();
2159 }
2160
2165 }
2166
2167 private sealed class SelectIPartitionIterator<TSource, TResult> : Iterator<TResult>, IPartition<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable
2168 {
2170
2172
2174
2180
2181 public override Iterator<TResult> Clone()
2182 {
2184 }
2185
2186 public override bool MoveNext()
2187 {
2188 int state = _state;
2189 if (state != 1)
2190 {
2191 if (state != 2)
2192 {
2193 goto IL_005a;
2194 }
2195 }
2196 else
2197 {
2198 _enumerator = _source.GetEnumerator();
2199 _state = 2;
2200 }
2201 if (_enumerator.MoveNext())
2202 {
2204 return true;
2205 }
2206 Dispose();
2207 goto IL_005a;
2208 IL_005a:
2209 return false;
2210 }
2211
2212 public override void Dispose()
2213 {
2214 if (_enumerator != null)
2215 {
2216 _enumerator.Dispose();
2217 _enumerator = null;
2218 }
2219 base.Dispose();
2220 }
2221
2226
2231
2236
2238 {
2239 bool found2;
2241 found = found2;
2242 if (!found2)
2243 {
2244 return default(TResult);
2245 }
2246 return _selector(arg);
2247 }
2248
2250 {
2251 bool found2;
2252 TSource arg = _source.TryGetFirst(out found2);
2253 found = found2;
2254 if (!found2)
2255 {
2256 return default(TResult);
2257 }
2258 return _selector(arg);
2259 }
2260
2262 {
2263 bool found2;
2264 TSource arg = _source.TryGetLast(out found2);
2265 found = found2;
2266 if (!found2)
2267 {
2268 return default(TResult);
2269 }
2270 return _selector(arg);
2271 }
2272
2274 {
2276 foreach (TSource item in _source)
2277 {
2279 }
2280 return largeArrayBuilder.ToArray();
2281 }
2282
2284 {
2285 TResult[] array = new TResult[count];
2286 int num = 0;
2287 foreach (TSource item in _source)
2288 {
2289 array[num] = _selector(item);
2290 num++;
2291 }
2292 return array;
2293 }
2294
2295 public TResult[] ToArray()
2296 {
2297 int count = _source.GetCount(onlyIfCheap: true);
2298 return count switch
2299 {
2300 -1 => LazyToArray(),
2301 0 => Array.Empty<TResult>(),
2303 };
2304 }
2305
2307 {
2308 int count = _source.GetCount(onlyIfCheap: true);
2310 switch (count)
2311 {
2312 case -1:
2313 list = new List<TResult>();
2314 break;
2315 case 0:
2316 return new List<TResult>();
2317 default:
2318 list = new List<TResult>(count);
2319 break;
2320 }
2321 foreach (TSource item in _source)
2322 {
2323 list.Add(_selector(item));
2324 }
2325 return list;
2326 }
2327
2328 public int GetCount(bool onlyIfCheap)
2329 {
2330 if (!onlyIfCheap)
2331 {
2332 int num = 0;
2333 {
2334 foreach (TSource item in _source)
2335 {
2336 _selector(item);
2337 num = checked(num + 1);
2338 }
2339 return num;
2340 }
2341 }
2342 return _source.GetCount(onlyIfCheap);
2343 }
2344 }
2345
2346 [DebuggerDisplay("Count = {Count}")]
2347 private sealed class SelectListPartitionIterator<TSource, TResult> : Iterator<TResult>, IPartition<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable
2348 {
2349 private readonly IList<TSource> _source;
2350
2352
2353 private readonly int _minIndexInclusive;
2354
2355 private readonly int _maxIndexInclusive;
2356
2357 private int Count
2358 {
2359 get
2360 {
2361 int count = _source.Count;
2363 {
2364 return 0;
2365 }
2367 }
2368 }
2369
2377
2382
2383 public override bool MoveNext()
2384 {
2385 int num = _state - 1;
2386 if ((uint)num <= (uint)(_maxIndexInclusive - _minIndexInclusive) && num < _source.Count - _minIndexInclusive)
2387 {
2389 _state++;
2390 return true;
2391 }
2392 Dispose();
2393 return false;
2394 }
2395
2400
2402 {
2403 int num = _minIndexInclusive + count;
2404 if ((uint)num <= (uint)_maxIndexInclusive)
2405 {
2407 }
2408 return EmptyPartition<TResult>.Instance;
2409 }
2410
2412 {
2413 int num = _minIndexInclusive + count - 1;
2414 if ((uint)num < (uint)_maxIndexInclusive)
2415 {
2417 }
2418 return this;
2419 }
2420
2422 {
2423 if ((uint)index <= (uint)(_maxIndexInclusive - _minIndexInclusive) && index < _source.Count - _minIndexInclusive)
2424 {
2425 found = true;
2427 }
2428 found = false;
2429 return default(TResult);
2430 }
2431
2433 {
2434 if (_source.Count > _minIndexInclusive)
2435 {
2436 found = true;
2438 }
2439 found = false;
2440 return default(TResult);
2441 }
2442
2444 {
2445 int num = _source.Count - 1;
2446 if (num >= _minIndexInclusive)
2447 {
2448 found = true;
2450 }
2451 found = false;
2452 return default(TResult);
2453 }
2454
2455 public TResult[] ToArray()
2456 {
2457 int count = Count;
2458 if (count == 0)
2459 {
2460 return Array.Empty<TResult>();
2461 }
2462 TResult[] array = new TResult[count];
2463 int num = 0;
2465 while (num != array.Length)
2466 {
2467 array[num] = _selector(_source[num2]);
2468 num++;
2469 num2++;
2470 }
2471 return array;
2472 }
2473
2475 {
2476 int count = Count;
2477 if (count == 0)
2478 {
2479 return new List<TResult>();
2480 }
2482 int num = _minIndexInclusive + count;
2483 for (int i = _minIndexInclusive; i != num; i++)
2484 {
2485 list.Add(_selector(_source[i]));
2486 }
2487 return list;
2488 }
2489
2490 public int GetCount(bool onlyIfCheap)
2491 {
2492 int count = Count;
2493 if (!onlyIfCheap)
2494 {
2495 int num = _minIndexInclusive + count;
2496 for (int i = _minIndexInclusive; i != num; i++)
2497 {
2498 _selector(_source[i]);
2499 }
2500 }
2501 return count;
2502 }
2503 }
2504
2505 private sealed class SelectManySingleSelectorIterator<TSource, TResult> : Iterator<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable
2506 {
2508
2510
2512
2514
2515 public int GetCount(bool onlyIfCheap)
2516 {
2517 if (onlyIfCheap)
2518 {
2519 return -1;
2520 }
2521 int num = 0;
2522 foreach (TSource item in _source)
2523 {
2524 num = checked(num + _selector(item).Count());
2525 }
2526 return num;
2527 }
2528
2551
2553 {
2555 foreach (TSource item in _source)
2556 {
2557 list.AddRange(_selector(item));
2558 }
2559 return list;
2560 }
2561
2567
2572
2573 public override void Dispose()
2574 {
2575 if (_subEnumerator != null)
2576 {
2577 _subEnumerator.Dispose();
2578 _subEnumerator = null;
2579 }
2580 if (_sourceEnumerator != null)
2581 {
2582 _sourceEnumerator.Dispose();
2583 _sourceEnumerator = null;
2584 }
2585 base.Dispose();
2586 }
2587
2588 public override bool MoveNext()
2589 {
2590 switch (_state)
2591 {
2592 case 1:
2594 _state = 2;
2595 goto case 2;
2596 case 2:
2597 {
2599 {
2600 break;
2601 }
2602 TSource current = _sourceEnumerator.Current;
2604 _state = 3;
2605 goto case 3;
2606 }
2607 case 3:
2608 if (!_subEnumerator.MoveNext())
2609 {
2610 _subEnumerator.Dispose();
2611 _subEnumerator = null;
2612 _state = 2;
2613 goto case 2;
2614 }
2616 return true;
2617 }
2618 Dispose();
2619 return false;
2620 }
2621 }
2622
2623 private abstract class UnionIterator<TSource> : Iterator<TSource>, IIListProvider<TSource>, IEnumerable<TSource>, IEnumerable
2624 {
2626
2628
2630
2632 {
2634 int num = 0;
2635 while (true)
2636 {
2638 if (enumerable == null)
2639 {
2640 break;
2641 }
2642 hashSet.UnionWith(enumerable);
2643 num++;
2644 }
2645 return hashSet;
2646 }
2647
2648 public TSource[] ToArray()
2649 {
2650 return HashSetToArray(FillSet());
2651 }
2652
2654 {
2655 return HashSetToList(FillSet());
2656 }
2657
2658 public int GetCount(bool onlyIfCheap)
2659 {
2660 if (!onlyIfCheap)
2661 {
2662 return FillSet().Count;
2663 }
2664 return -1;
2665 }
2666
2671
2672 public sealed override void Dispose()
2673 {
2674 if (_enumerator != null)
2675 {
2676 _enumerator.Dispose();
2677 _enumerator = null;
2678 _set = null;
2679 }
2680 base.Dispose();
2681 }
2682
2684
2686
2688 {
2689 _enumerator?.Dispose();
2691 }
2692
2693 private void StoreFirst()
2694 {
2696 TSource current = _enumerator.Current;
2697 hashSet.Add(current);
2698 _current = current;
2699 _set = hashSet;
2700 }
2701
2702 private bool GetNext()
2703 {
2704 HashSet<TSource> set = _set;
2705 while (_enumerator.MoveNext())
2706 {
2707 TSource current = _enumerator.Current;
2708 if (set.Add(current))
2709 {
2710 _current = current;
2711 return true;
2712 }
2713 }
2714 return false;
2715 }
2716
2717 public sealed override bool MoveNext()
2718 {
2719 if (_state == 1)
2720 {
2722 {
2725 _state++;
2726 if (enumerator.MoveNext())
2727 {
2728 StoreFirst();
2729 return true;
2730 }
2731 }
2732 }
2733 else if (_state > 0)
2734 {
2735 while (true)
2736 {
2737 if (GetNext())
2738 {
2739 return true;
2740 }
2742 if (enumerable2 == null)
2743 {
2744 break;
2745 }
2747 _state++;
2748 }
2749 }
2750 Dispose();
2751 return false;
2752 }
2753 }
2754
2755 private sealed class WhereEnumerableIterator<TSource> : Iterator<TSource>, IIListProvider<TSource>, IEnumerable<TSource>, IEnumerable
2756 {
2758
2760
2762
2763 public int GetCount(bool onlyIfCheap)
2764 {
2765 if (onlyIfCheap)
2766 {
2767 return -1;
2768 }
2769 int num = 0;
2770 foreach (TSource item in _source)
2771 {
2772 if (_predicate(item))
2773 {
2774 num = checked(num + 1);
2775 }
2776 }
2777 return num;
2778 }
2779
2780 public TSource[] ToArray()
2781 {
2783 foreach (TSource item in _source)
2784 {
2785 if (_predicate(item))
2786 {
2788 }
2789 }
2790 return largeArrayBuilder.ToArray();
2791 }
2792
2794 {
2796 foreach (TSource item in _source)
2797 {
2798 if (_predicate(item))
2799 {
2800 list.Add(item);
2801 }
2802 }
2803 return list;
2804 }
2805
2811
2812 public override Iterator<TSource> Clone()
2813 {
2815 }
2816
2817 public override void Dispose()
2818 {
2819 if (_enumerator != null)
2820 {
2821 _enumerator.Dispose();
2822 _enumerator = null;
2823 }
2824 base.Dispose();
2825 }
2826
2827 public override bool MoveNext()
2828 {
2829 int state = _state;
2830 if (state != 1)
2831 {
2832 if (state != 2)
2833 {
2834 goto IL_0061;
2835 }
2836 }
2837 else
2838 {
2840 _state = 2;
2841 }
2842 while (_enumerator.MoveNext())
2843 {
2844 TSource current = _enumerator.Current;
2845 if (_predicate(current))
2846 {
2847 _current = current;
2848 return true;
2849 }
2850 }
2851 Dispose();
2852 goto IL_0061;
2853 IL_0061:
2854 return false;
2855 }
2856
2861
2866 }
2867
2868 internal sealed class WhereArrayIterator<TSource> : Iterator<TSource>, IIListProvider<TSource>, IEnumerable<TSource>, IEnumerable
2869 {
2870 private readonly TSource[] _source;
2871
2873
2874 public int GetCount(bool onlyIfCheap)
2875 {
2876 if (onlyIfCheap)
2877 {
2878 return -1;
2879 }
2880 int num = 0;
2881 TSource[] source = _source;
2882 foreach (TSource arg in source)
2883 {
2884 if (_predicate(arg))
2885 {
2886 num = checked(num + 1);
2887 }
2888 }
2889 return num;
2890 }
2891
2892 public TSource[] ToArray()
2893 {
2895 TSource[] source = _source;
2896 foreach (TSource val in source)
2897 {
2898 if (_predicate(val))
2899 {
2901 }
2902 }
2903 return largeArrayBuilder.ToArray();
2904 }
2905
2907 {
2909 TSource[] source = _source;
2910 foreach (TSource val in source)
2911 {
2912 if (_predicate(val))
2913 {
2914 list.Add(val);
2915 }
2916 }
2917 return list;
2918 }
2919
2925
2926 public override Iterator<TSource> Clone()
2927 {
2929 }
2930
2931 public override bool MoveNext()
2932 {
2933 int num = _state - 1;
2934 TSource[] source = _source;
2935 while ((uint)num < (uint)source.Length)
2936 {
2937 TSource val = source[num];
2938 num = _state++;
2939 if (_predicate(val))
2940 {
2941 _current = val;
2942 return true;
2943 }
2944 }
2945 Dispose();
2946 return false;
2947 }
2948
2953
2955 {
2956 return new WhereArrayIterator<TSource>(_source, Utilities.CombinePredicates(_predicate, predicate));
2957 }
2958 }
2959
2960 private sealed class WhereListIterator<TSource> : Iterator<TSource>, IIListProvider<TSource>, IEnumerable<TSource>, IEnumerable
2961 {
2962 private readonly List<TSource> _source;
2963
2965
2967
2968 public int GetCount(bool onlyIfCheap)
2969 {
2970 if (onlyIfCheap)
2971 {
2972 return -1;
2973 }
2974 int num = 0;
2975 for (int i = 0; i < _source.Count; i++)
2976 {
2977 TSource arg = _source[i];
2978 if (_predicate(arg))
2979 {
2980 num = checked(num + 1);
2981 }
2982 }
2983 return num;
2984 }
2985
2986 public TSource[] ToArray()
2987 {
2989 for (int i = 0; i < _source.Count; i++)
2990 {
2991 TSource val = _source[i];
2992 if (_predicate(val))
2993 {
2995 }
2996 }
2997 return largeArrayBuilder.ToArray();
2998 }
2999
3001 {
3003 for (int i = 0; i < _source.Count; i++)
3004 {
3005 TSource val = _source[i];
3006 if (_predicate(val))
3007 {
3008 list.Add(val);
3009 }
3010 }
3011 return list;
3012 }
3013
3019
3020 public override Iterator<TSource> Clone()
3021 {
3023 }
3024
3025 public override bool MoveNext()
3026 {
3027 int state = _state;
3028 if (state != 1)
3029 {
3030 if (state != 2)
3031 {
3032 goto IL_0061;
3033 }
3034 }
3035 else
3036 {
3038 _state = 2;
3039 }
3040 while (_enumerator.MoveNext())
3041 {
3042 TSource current = _enumerator.Current;
3043 if (_predicate(current))
3044 {
3045 _current = current;
3046 return true;
3047 }
3048 }
3049 Dispose();
3050 goto IL_0061;
3051 IL_0061:
3052 return false;
3053 }
3054
3059
3061 {
3062 return new WhereListIterator<TSource>(_source, Utilities.CombinePredicates(_predicate, predicate));
3063 }
3064 }
3065
3066 private sealed class WhereSelectArrayIterator<TSource, TResult> : Iterator<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable
3067 {
3068 private readonly TSource[] _source;
3069
3071
3073
3074 public int GetCount(bool onlyIfCheap)
3075 {
3076 if (onlyIfCheap)
3077 {
3078 return -1;
3079 }
3080 int num = 0;
3081 TSource[] source = _source;
3082 foreach (TSource arg in source)
3083 {
3084 if (_predicate(arg))
3085 {
3086 _selector(arg);
3087 num = checked(num + 1);
3088 }
3089 }
3090 return num;
3091 }
3092
3093 public TResult[] ToArray()
3094 {
3096 TSource[] source = _source;
3097 foreach (TSource arg in source)
3098 {
3099 if (_predicate(arg))
3100 {
3102 }
3103 }
3104 return largeArrayBuilder.ToArray();
3105 }
3106
3108 {
3110 TSource[] source = _source;
3111 foreach (TSource arg in source)
3112 {
3113 if (_predicate(arg))
3114 {
3115 list.Add(_selector(arg));
3116 }
3117 }
3118 return list;
3119 }
3120
3127
3132
3133 public override bool MoveNext()
3134 {
3135 int num = _state - 1;
3136 TSource[] source = _source;
3137 while ((uint)num < (uint)source.Length)
3138 {
3139 TSource arg = source[num];
3140 num = _state++;
3141 if (_predicate(arg))
3142 {
3144 return true;
3145 }
3146 }
3147 Dispose();
3148 return false;
3149 }
3150
3155 }
3156
3157 private sealed class WhereSelectListIterator<TSource, TResult> : Iterator<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable
3158 {
3159 private readonly List<TSource> _source;
3160
3162
3164
3166
3167 public int GetCount(bool onlyIfCheap)
3168 {
3169 if (onlyIfCheap)
3170 {
3171 return -1;
3172 }
3173 int num = 0;
3174 for (int i = 0; i < _source.Count; i++)
3175 {
3176 TSource arg = _source[i];
3177 if (_predicate(arg))
3178 {
3179 _selector(arg);
3180 num = checked(num + 1);
3181 }
3182 }
3183 return num;
3184 }
3185
3186 public TResult[] ToArray()
3187 {
3189 for (int i = 0; i < _source.Count; i++)
3190 {
3191 TSource arg = _source[i];
3192 if (_predicate(arg))
3193 {
3195 }
3196 }
3197 return largeArrayBuilder.ToArray();
3198 }
3199
3201 {
3203 for (int i = 0; i < _source.Count; i++)
3204 {
3205 TSource arg = _source[i];
3206 if (_predicate(arg))
3207 {
3209 }
3210 }
3211 return list;
3212 }
3213
3220
3225
3226 public override bool MoveNext()
3227 {
3228 int state = _state;
3229 if (state != 1)
3230 {
3231 if (state != 2)
3232 {
3233 goto IL_006c;
3234 }
3235 }
3236 else
3237 {
3239 _state = 2;
3240 }
3241 while (_enumerator.MoveNext())
3242 {
3243 TSource current = _enumerator.Current;
3244 if (_predicate(current))
3245 {
3246 _current = _selector(current);
3247 return true;
3248 }
3249 }
3250 Dispose();
3251 goto IL_006c;
3252 IL_006c:
3253 return false;
3254 }
3255
3260 }
3261
3262 private sealed class WhereSelectEnumerableIterator<TSource, TResult> : Iterator<TResult>, IIListProvider<TResult>, IEnumerable<TResult>, IEnumerable
3263 {
3265
3267
3269
3271
3272 public int GetCount(bool onlyIfCheap)
3273 {
3274 if (onlyIfCheap)
3275 {
3276 return -1;
3277 }
3278 int num = 0;
3279 foreach (TSource item in _source)
3280 {
3281 if (_predicate(item))
3282 {
3283 _selector(item);
3284 num = checked(num + 1);
3285 }
3286 }
3287 return num;
3288 }
3289
3290 public TResult[] ToArray()
3291 {
3293 foreach (TSource item in _source)
3294 {
3295 if (_predicate(item))
3296 {
3298 }
3299 }
3300 return largeArrayBuilder.ToArray();
3301 }
3302
3304 {
3306 foreach (TSource item in _source)
3307 {
3308 if (_predicate(item))
3309 {
3310 list.Add(_selector(item));
3311 }
3312 }
3313 return list;
3314 }
3315
3322
3327
3328 public override void Dispose()
3329 {
3330 if (_enumerator != null)
3331 {
3332 _enumerator.Dispose();
3333 _enumerator = null;
3334 }
3335 base.Dispose();
3336 }
3337
3338 public override bool MoveNext()
3339 {
3340 int state = _state;
3341 if (state != 1)
3342 {
3343 if (state != 2)
3344 {
3345 goto IL_006c;
3346 }
3347 }
3348 else
3349 {
3351 _state = 2;
3352 }
3353 while (_enumerator.MoveNext())
3354 {
3355 TSource current = _enumerator.Current;
3356 if (_predicate(current))
3357 {
3358 _current = _selector(current);
3359 return true;
3360 }
3361 }
3362 Dispose();
3363 goto IL_006c;
3364 IL_006c:
3365 return false;
3366 }
3367
3372 }
3373
3374 internal abstract class Iterator<TSource> : IEnumerable<TSource>, IEnumerable, IEnumerator<TSource>, IEnumerator, IDisposable
3375 {
3376 private readonly int _threadId;
3377
3378 internal int _state;
3379
3380 internal TSource _current;
3381
3382 public TSource Current => _current;
3383
3384 object IEnumerator.Current => Current;
3385
3386 protected Iterator()
3387 {
3389 }
3390
3391 public abstract Iterator<TSource> Clone();
3392
3393 public virtual void Dispose()
3394 {
3395 _current = default(TSource);
3396 _state = -1;
3397 }
3398
3400 {
3402 iterator._state = 1;
3403 return iterator;
3404 }
3405
3406 public abstract bool MoveNext();
3407
3412
3417
3419 {
3420 return GetEnumerator();
3421 }
3422
3427 }
3428
3429 private sealed class UnionIterator2<TSource> : UnionIterator<TSource>
3430 {
3432
3434
3441
3442 public override Iterator<TSource> Clone()
3443 {
3445 }
3446
3448 {
3449 return index switch
3450 {
3451 0 => _first,
3452 1 => _second,
3453 _ => null,
3454 };
3455 }
3456
3462 }
3463
3464 private sealed class UnionIteratorN<TSource> : UnionIterator<TSource>
3465 {
3467
3468 private readonly int _headIndex;
3469
3476
3477 public override Iterator<TSource> Clone()
3478 {
3480 }
3481
3483 {
3484 if (index <= _headIndex)
3485 {
3486 return _sources.GetNode(_headIndex - index).Item;
3487 }
3488 return null;
3489 }
3490
3492 {
3493 if (_headIndex == 2147483645)
3494 {
3495 return new UnionIterator2<TSource>(this, next, _comparer);
3496 }
3498 }
3499 }
3500
3502 {
3503 return EmptyPartition<TResult>.Instance;
3504 }
3505
3507 {
3509 {
3510 return new EnumerablePartition<TSource>(source, count, -1);
3511 }
3512 return new ListPartition<TSource>(source2, count, int.MaxValue);
3513 }
3514
3516 {
3518 {
3520 {
3521 return new EnumerablePartition<TSource>(source, 0, count - 1);
3522 }
3523 return new ListPartition<TSource>(source2, 0, count - 1);
3524 }
3525 return partition.Take(count);
3526 }
3527
3529 {
3531 {
3533 {
3535 }
3537 }
3540 {
3541 partition = ((endIndex == 0) ? EmptyPartition<TSource>.Instance : partition.Take(endIndex));
3542 if (startIndex != 0)
3543 {
3544 return partition.Skip(startIndex);
3545 }
3546 return partition;
3547 }
3548 }
3549
3551 {
3552 if (source == null)
3553 {
3555 }
3556 if (func == null)
3557 {
3559 }
3560 using IEnumerator<TSource> enumerator = source.GetEnumerator();
3561 if (!enumerator.MoveNext())
3562 {
3564 }
3565 TSource val = enumerator.Current;
3566 while (enumerator.MoveNext())
3567 {
3568 val = func(val, enumerator.Current);
3569 }
3570 return val;
3571 }
3572
3574 {
3575 if (source == null)
3576 {
3578 }
3579 if (func == null)
3580 {
3582 }
3583 TAccumulate val = seed;
3584 foreach (TSource item in source)
3585 {
3586 val = func(val, item);
3587 }
3588 return val;
3589 }
3590
3592 {
3593 if (source == null)
3594 {
3596 }
3597 if (func == null)
3598 {
3600 }
3601 if (resultSelector == null)
3602 {
3604 }
3605 TAccumulate val = seed;
3606 foreach (TSource item in source)
3607 {
3608 val = func(val, item);
3609 }
3610 return resultSelector(val);
3611 }
3612
3614 {
3615 if (source == null)
3616 {
3618 }
3620 {
3621 return collection.Count != 0;
3622 }
3624 {
3625 int count = iIListProvider.GetCount(onlyIfCheap: true);
3626 if (count >= 0)
3627 {
3628 return count != 0;
3629 }
3630 }
3632 {
3633 return collection2.Count != 0;
3634 }
3635 using IEnumerator<TSource> enumerator = source.GetEnumerator();
3636 return enumerator.MoveNext();
3637 }
3638
3640 {
3641 if (source == null)
3642 {
3644 }
3645 if (predicate == null)
3646 {
3648 }
3649 foreach (TSource item in source)
3650 {
3651 if (predicate(item))
3652 {
3653 return true;
3654 }
3655 }
3656 return false;
3657 }
3658
3660 {
3661 if (source == null)
3662 {
3664 }
3665 if (predicate == null)
3666 {
3668 }
3669 foreach (TSource item in source)
3670 {
3671 if (!predicate(item))
3672 {
3673 return false;
3674 }
3675 }
3676 return true;
3677 }
3678
3680 {
3681 if (source == null)
3682 {
3684 }
3686 {
3687 return new AppendPrepend1Iterator<TSource>(source, element, appending: true);
3688 }
3689 return appendPrependIterator.Append(element);
3690 }
3691
3693 {
3694 if (source == null)
3695 {
3697 }
3699 {
3700 return new AppendPrepend1Iterator<TSource>(source, element, appending: false);
3701 }
3702 return appendPrependIterator.Prepend(element);
3703 }
3704
3705 public static double Average(this IEnumerable<int> source)
3706 {
3707 if (source == null)
3708 {
3710 }
3711 checked
3712 {
3714 if (!enumerator.MoveNext())
3715 {
3717 }
3718 long num = enumerator.Current;
3719 long num2 = 1L;
3720 while (enumerator.MoveNext())
3721 {
3722 num += enumerator.Current;
3723 num2++;
3724 }
3725 return (double)num / (double)num2;
3726 }
3727 }
3728
3729 public static double? Average(this IEnumerable<int?> source)
3730 {
3731 if (source == null)
3732 {
3734 }
3735 checked
3736 {
3738 {
3739 while (enumerator.MoveNext())
3740 {
3741 int? current = enumerator.Current;
3742 if (!current.HasValue)
3743 {
3744 continue;
3745 }
3746 long num = current.GetValueOrDefault();
3747 long num2 = 1L;
3748 while (enumerator.MoveNext())
3749 {
3750 current = enumerator.Current;
3751 if (current.HasValue)
3752 {
3753 num += current.GetValueOrDefault();
3754 num2++;
3755 }
3756 }
3757 return (double)num / (double)num2;
3758 }
3759 }
3760 return null;
3761 }
3762 }
3763
3764 public static double Average(this IEnumerable<long> source)
3765 {
3766 if (source == null)
3767 {
3769 }
3770 checked
3771 {
3773 if (!enumerator.MoveNext())
3774 {
3776 }
3777 long num = enumerator.Current;
3778 long num2 = 1L;
3779 while (enumerator.MoveNext())
3780 {
3781 num += enumerator.Current;
3782 num2++;
3783 }
3784 return (double)num / (double)num2;
3785 }
3786 }
3787
3788 public static double? Average(this IEnumerable<long?> source)
3789 {
3790 if (source == null)
3791 {
3793 }
3794 checked
3795 {
3797 {
3798 while (enumerator.MoveNext())
3799 {
3800 long? current = enumerator.Current;
3801 if (!current.HasValue)
3802 {
3803 continue;
3804 }
3805 long num = current.GetValueOrDefault();
3806 long num2 = 1L;
3807 while (enumerator.MoveNext())
3808 {
3809 current = enumerator.Current;
3810 if (current.HasValue)
3811 {
3812 num += current.GetValueOrDefault();
3813 num2++;
3814 }
3815 }
3816 return (double)num / (double)num2;
3817 }
3818 }
3819 return null;
3820 }
3821 }
3822
3823 public static float Average(this IEnumerable<float> source)
3824 {
3825 if (source == null)
3826 {
3828 }
3829 using IEnumerator<float> enumerator = source.GetEnumerator();
3830 if (!enumerator.MoveNext())
3831 {
3833 }
3834 double num = enumerator.Current;
3835 long num2 = 1L;
3836 while (enumerator.MoveNext())
3837 {
3838 num += (double)enumerator.Current;
3839 num2++;
3840 }
3841 return (float)(num / (double)num2);
3842 }
3843
3844 public static float? Average(this IEnumerable<float?> source)
3845 {
3846 if (source == null)
3847 {
3849 }
3851 {
3852 while (enumerator.MoveNext())
3853 {
3854 float? current = enumerator.Current;
3855 if (!current.HasValue)
3856 {
3857 continue;
3858 }
3859 double num = current.GetValueOrDefault();
3860 long num2 = 1L;
3861 while (enumerator.MoveNext())
3862 {
3863 current = enumerator.Current;
3864 if (current.HasValue)
3865 {
3866 num += (double)current.GetValueOrDefault();
3867 num2 = checked(num2 + 1);
3868 }
3869 }
3870 return (float)(num / (double)num2);
3871 }
3872 }
3873 return null;
3874 }
3875
3876 public static double Average(this IEnumerable<double> source)
3877 {
3878 if (source == null)
3879 {
3881 }
3882 using IEnumerator<double> enumerator = source.GetEnumerator();
3883 if (!enumerator.MoveNext())
3884 {
3886 }
3887 double num = enumerator.Current;
3888 long num2 = 1L;
3889 while (enumerator.MoveNext())
3890 {
3891 num += enumerator.Current;
3892 num2++;
3893 }
3894 return num / (double)num2;
3895 }
3896
3897 public static double? Average(this IEnumerable<double?> source)
3898 {
3899 if (source == null)
3900 {
3902 }
3904 {
3905 while (enumerator.MoveNext())
3906 {
3907 double? current = enumerator.Current;
3908 if (!current.HasValue)
3909 {
3910 continue;
3911 }
3912 double num = current.GetValueOrDefault();
3913 long num2 = 1L;
3914 while (enumerator.MoveNext())
3915 {
3916 current = enumerator.Current;
3917 if (current.HasValue)
3918 {
3919 num += current.GetValueOrDefault();
3920 num2 = checked(num2 + 1);
3921 }
3922 }
3923 return num / (double)num2;
3924 }
3925 }
3926 return null;
3927 }
3928
3929 public static decimal Average(this IEnumerable<decimal> source)
3930 {
3931 if (source == null)
3932 {
3934 }
3935 using IEnumerator<decimal> enumerator = source.GetEnumerator();
3936 if (!enumerator.MoveNext())
3937 {
3939 }
3940 decimal current = enumerator.Current;
3941 long num = 1L;
3942 while (enumerator.MoveNext())
3943 {
3944 current += enumerator.Current;
3945 num++;
3946 }
3947 return current / (decimal)num;
3948 }
3949
3950 public static decimal? Average(this IEnumerable<decimal?> source)
3951 {
3952 if (source == null)
3953 {
3955 }
3957 {
3958 while (enumerator.MoveNext())
3959 {
3960 decimal? current = enumerator.Current;
3961 if (!current.HasValue)
3962 {
3963 continue;
3964 }
3965 decimal valueOrDefault = current.GetValueOrDefault();
3966 long num = 1L;
3967 while (enumerator.MoveNext())
3968 {
3969 current = enumerator.Current;
3970 if (current.HasValue)
3971 {
3972 valueOrDefault += current.GetValueOrDefault();
3973 num++;
3974 }
3975 }
3976 return valueOrDefault / (decimal)num;
3977 }
3978 }
3979 return null;
3980 }
3981
3983 {
3984 if (source == null)
3985 {
3987 }
3988 if (selector == null)
3989 {
3991 }
3992 checked
3993 {
3994 using IEnumerator<TSource> enumerator = source.GetEnumerator();
3995 if (!enumerator.MoveNext())
3996 {
3998 }
3999 long num = selector(enumerator.Current);
4000 long num2 = 1L;
4001 while (enumerator.MoveNext())
4002 {
4003 num += selector(enumerator.Current);
4004 num2++;
4005 }
4006 return (double)num / (double)num2;
4007 }
4008 }
4009
4011 {
4012 if (source == null)
4013 {
4015 }
4016 if (selector == null)
4017 {
4019 }
4020 checked
4021 {
4023 {
4024 while (enumerator.MoveNext())
4025 {
4026 int? num = selector(enumerator.Current);
4027 if (!num.HasValue)
4028 {
4029 continue;
4030 }
4031 long num2 = num.GetValueOrDefault();
4032 long num3 = 1L;
4033 while (enumerator.MoveNext())
4034 {
4035 num = selector(enumerator.Current);
4036 if (num.HasValue)
4037 {
4038 num2 += num.GetValueOrDefault();
4039 num3++;
4040 }
4041 }
4042 return (double)num2 / (double)num3;
4043 }
4044 }
4045 return null;
4046 }
4047 }
4048
4050 {
4051 if (source == null)
4052 {
4054 }
4055 if (selector == null)
4056 {
4058 }
4059 checked
4060 {
4061 using IEnumerator<TSource> enumerator = source.GetEnumerator();
4062 if (!enumerator.MoveNext())
4063 {
4065 }
4066 long num = selector(enumerator.Current);
4067 long num2 = 1L;
4068 while (enumerator.MoveNext())
4069 {
4070 num += selector(enumerator.Current);
4071 num2++;
4072 }
4073 return (double)num / (double)num2;
4074 }
4075 }
4076
4078 {
4079 if (source == null)
4080 {
4082 }
4083 if (selector == null)
4084 {
4086 }
4087 checked
4088 {
4090 {
4091 while (enumerator.MoveNext())
4092 {
4093 long? num = selector(enumerator.Current);
4094 if (!num.HasValue)
4095 {
4096 continue;
4097 }
4098 long num2 = num.GetValueOrDefault();
4099 long num3 = 1L;
4100 while (enumerator.MoveNext())
4101 {
4102 num = selector(enumerator.Current);
4103 if (num.HasValue)
4104 {
4105 num2 += num.GetValueOrDefault();
4106 num3++;
4107 }
4108 }
4109 return (double)num2 / (double)num3;
4110 }
4111 }
4112 return null;
4113 }
4114 }
4115
4117 {
4118 if (source == null)
4119 {
4121 }
4122 if (selector == null)
4123 {
4125 }
4126 using IEnumerator<TSource> enumerator = source.GetEnumerator();
4127 if (!enumerator.MoveNext())
4128 {
4130 }
4131 double num = selector(enumerator.Current);
4132 long num2 = 1L;
4133 while (enumerator.MoveNext())
4134 {
4135 num += (double)selector(enumerator.Current);
4136 num2++;
4137 }
4138 return (float)(num / (double)num2);
4139 }
4140
4142 {
4143 if (source == null)
4144 {
4146 }
4147 if (selector == null)
4148 {
4150 }
4152 {
4153 while (enumerator.MoveNext())
4154 {
4155 float? num = selector(enumerator.Current);
4156 if (!num.HasValue)
4157 {
4158 continue;
4159 }
4160 double num2 = num.GetValueOrDefault();
4161 long num3 = 1L;
4162 while (enumerator.MoveNext())
4163 {
4164 num = selector(enumerator.Current);
4165 if (num.HasValue)
4166 {
4167 num2 += (double)num.GetValueOrDefault();
4168 num3 = checked(num3 + 1);
4169 }
4170 }
4171 return (float)(num2 / (double)num3);
4172 }
4173 }
4174 return null;
4175 }
4176
4178 {
4179 if (source == null)
4180 {
4182 }
4183 if (selector == null)
4184 {
4186 }
4187 using IEnumerator<TSource> enumerator = source.GetEnumerator();
4188 if (!enumerator.MoveNext())
4189 {
4191 }
4192 double num = selector(enumerator.Current);
4193 long num2 = 1L;
4194 while (enumerator.MoveNext())
4195 {
4196 num += selector(enumerator.Current);
4197 num2++;
4198 }
4199 return num / (double)num2;
4200 }
4201
4203 {
4204 if (source == null)
4205 {
4207 }
4208 if (selector == null)
4209 {
4211 }
4213 {
4214 while (enumerator.MoveNext())
4215 {
4216 double? num = selector(enumerator.Current);
4217 if (!num.HasValue)
4218 {
4219 continue;
4220 }
4221 double num2 = num.GetValueOrDefault();
4222 long num3 = 1L;
4223 while (enumerator.MoveNext())
4224 {
4225 num = selector(enumerator.Current);
4226 if (num.HasValue)
4227 {
4228 num2 += num.GetValueOrDefault();
4229 num3 = checked(num3 + 1);
4230 }
4231 }
4232 return num2 / (double)num3;
4233 }
4234 }
4235 return null;
4236 }
4237
4239 {
4240 if (source == null)
4241 {
4243 }
4244 if (selector == null)
4245 {
4247 }
4248 using IEnumerator<TSource> enumerator = source.GetEnumerator();
4249 if (!enumerator.MoveNext())
4250 {
4252 }
4253 decimal num = selector(enumerator.Current);
4254 long num2 = 1L;
4255 while (enumerator.MoveNext())
4256 {
4257 num += selector(enumerator.Current);
4258 num2++;
4259 }
4260 return num / (decimal)num2;
4261 }
4262
4264 {
4265 if (source == null)
4266 {
4268 }
4269 if (selector == null)
4270 {
4272 }
4274 {
4275 while (enumerator.MoveNext())
4276 {
4277 decimal? num = selector(enumerator.Current);
4278 if (!num.HasValue)
4279 {
4280 continue;
4281 }
4282 decimal valueOrDefault = num.GetValueOrDefault();
4283 long num2 = 1L;
4284 while (enumerator.MoveNext())
4285 {
4286 num = selector(enumerator.Current);
4287 if (num.HasValue)
4288 {
4289 valueOrDefault += num.GetValueOrDefault();
4290 num2++;
4291 }
4292 }
4293 return valueOrDefault / (decimal)num2;
4294 }
4295 }
4296 return null;
4297 }
4298
4300 {
4301 if (source == null)
4302 {
4304 }
4306 }
4307
4309 {
4310 foreach (object item in source)
4311 {
4312 if (item is TResult)
4313 {
4314 yield return (TResult)item;
4315 }
4316 }
4317 }
4318
4320 {
4321 if (source is IEnumerable<TResult> result)
4322 {
4323 return result;
4324 }
4325 if (source == null)
4326 {
4328 }
4330 }
4331
4333 {
4334 foreach (object item in source)
4335 {
4336 yield return (TResult)item;
4337 }
4338 }
4339
4341 {
4342 if (source == null)
4343 {
4345 }
4346 if (size < 1)
4347 {
4349 }
4350 return ChunkIterator(source, size);
4351 }
4352
4354 {
4355 using IEnumerator<TSource> e = source.GetEnumerator();
4356 while (e.MoveNext())
4357 {
4358 TSource[] array = new TSource[size];
4359 array[0] = e.Current;
4360 int i;
4361 for (i = 1; i < array.Length; i++)
4362 {
4363 if (!e.MoveNext())
4364 {
4365 break;
4366 }
4367 array[i] = e.Current;
4368 }
4369 if (i == array.Length)
4370 {
4371 yield return array;
4372 continue;
4373 }
4374 Array.Resize(ref array, i);
4375 yield return array;
4376 break;
4377 }
4378 }
4379
4381 {
4382 if (first == null)
4383 {
4385 }
4386 if (second == null)
4387 {
4389 }
4391 {
4393 }
4394 return concatIterator.Concat(second);
4395 }
4396
4397 public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value)
4398 {
4400 {
4401 return source.Contains(value, null);
4402 }
4403 return collection.Contains(value);
4404 }
4405
4407 {
4408 if (source == null)
4409 {
4411 }
4412 if (comparer == null)
4413 {
4414 foreach (TSource item in source)
4415 {
4417 {
4418 return true;
4419 }
4420 }
4421 }
4422 else
4423 {
4424 foreach (TSource item2 in source)
4425 {
4426 if (comparer.Equals(item2, value))
4427 {
4428 return true;
4429 }
4430 }
4431 }
4432 return false;
4433 }
4434
4436 {
4437 if (source == null)
4438 {
4440 }
4442 {
4443 return collection.Count;
4444 }
4446 {
4447 return iIListProvider.GetCount(onlyIfCheap: false);
4448 }
4450 {
4451 return collection2.Count;
4452 }
4453 int num = 0;
4454 using IEnumerator<TSource> enumerator = source.GetEnumerator();
4455 while (enumerator.MoveNext())
4456 {
4457 num = checked(num + 1);
4458 }
4459 return num;
4460 }
4461
4463 {
4464 if (source == null)
4465 {
4467 }
4468 if (predicate == null)
4469 {
4471 }
4472 int num = 0;
4473 foreach (TSource item in source)
4474 {
4475 if (predicate(item))
4476 {
4477 num = checked(num + 1);
4478 }
4479 }
4480 return num;
4481 }
4482
4484 {
4485 if (source == null)
4486 {
4488 }
4490 {
4491 count = collection.Count;
4492 return true;
4493 }
4495 {
4496 int count2 = iIListProvider.GetCount(onlyIfCheap: true);
4497 if (count2 >= 0)
4498 {
4499 count = count2;
4500 return true;
4501 }
4502 }
4504 {
4506 return true;
4507 }
4508 count = 0;
4509 return false;
4510 }
4511
4513 {
4514 if (source == null)
4515 {
4517 }
4518 long num = 0L;
4519 using IEnumerator<TSource> enumerator = source.GetEnumerator();
4520 while (enumerator.MoveNext())
4521 {
4522 num = checked(num + 1);
4523 }
4524 return num;
4525 }
4526
4528 {
4529 if (source == null)
4530 {
4532 }
4533 if (predicate == null)
4534 {
4536 }
4537 long num = 0L;
4538 foreach (TSource item in source)
4539 {
4540 if (predicate(item))
4541 {
4542 num = checked(num + 1);
4543 }
4544 }
4545 return num;
4546 }
4547
4549 {
4550 return source.DefaultIfEmpty(default(TSource));
4551 }
4552
4561
4563 {
4564 return source.Distinct(null);
4565 }
4566
4575
4580
4593
4595 {
4596 using IEnumerator<TSource> enumerator = source.GetEnumerator();
4597 if (!enumerator.MoveNext())
4598 {
4599 yield break;
4600 }
4601 HashSet<TKey> set = new HashSet<TKey>(7, comparer);
4602 do
4603 {
4604 TSource current = enumerator.Current;
4605 if (set.Add(keySelector(current)))
4606 {
4607 yield return current;
4608 }
4609 }
4610 while (enumerator.MoveNext());
4611 }
4612
4613 public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index)
4614 {
4615 if (source == null)
4616 {
4618 }
4620 {
4621 bool found;
4622 TSource result = partition.TryGetElementAt(index, out found);
4623 if (found)
4624 {
4625 return result;
4626 }
4627 }
4628 else
4629 {
4631 {
4632 return list[index];
4633 }
4634 if (TryGetElement<TSource>(source, index, out var element))
4635 {
4636 return element;
4637 }
4638 }
4640 return default(TSource);
4641 }
4642
4644 {
4645 if (source == null)
4646 {
4648 }
4649 if (!index.IsFromEnd)
4650 {
4651 return source.ElementAt(index.Value);
4652 }
4653 if (source.TryGetNonEnumeratedCount(out var count))
4654 {
4655 return source.ElementAt(count - index.Value);
4656 }
4657 if (!TryGetElementFromEnd<TSource>(source, index.Value, out var element))
4658 {
4660 }
4661 return element;
4662 }
4663
4665 {
4666 if (source == null)
4667 {
4669 }
4671 {
4672 bool found;
4673 return partition.TryGetElementAt(index, out found);
4674 }
4676 {
4678 {
4679 return default(TSource);
4680 }
4681 return list[index];
4682 }
4684 return element;
4685 }
4686
4688 {
4689 if (source == null)
4690 {
4692 }
4693 if (!index.IsFromEnd)
4694 {
4695 return source.ElementAtOrDefault(index.Value);
4696 }
4697 if (source.TryGetNonEnumeratedCount(out var count))
4698 {
4699 return source.ElementAtOrDefault(count - index.Value);
4700 }
4702 return element;
4703 }
4704
4705 private static bool TryGetElement<TSource>(IEnumerable<TSource> source, int index, [MaybeNullWhen(false)] out TSource element)
4706 {
4707 if (index >= 0)
4708 {
4709 using IEnumerator<TSource> enumerator = source.GetEnumerator();
4710 while (enumerator.MoveNext())
4711 {
4712 if (index == 0)
4713 {
4714 element = enumerator.Current;
4715 return true;
4716 }
4717 index--;
4718 }
4719 }
4720 element = default(TSource);
4721 return false;
4722 }
4723
4725 {
4726 if (indexFromEnd > 0)
4727 {
4728 using IEnumerator<TSource> enumerator = source.GetEnumerator();
4729 if (enumerator.MoveNext())
4730 {
4732 queue.Enqueue(enumerator.Current);
4733 while (enumerator.MoveNext())
4734 {
4735 if (queue.Count == indexFromEnd)
4736 {
4737 queue.Dequeue();
4738 }
4739 queue.Enqueue(enumerator.Current);
4740 }
4741 if (queue.Count == indexFromEnd)
4742 {
4743 element = queue.Dequeue();
4744 return true;
4745 }
4746 }
4747 }
4748 element = default(TSource);
4749 return false;
4750 }
4751
4753 {
4754 return source;
4755 }
4756
4758 {
4759 if (first == null)
4760 {
4762 }
4763 if (second == null)
4764 {
4766 }
4767 return ExceptIterator(first, second, null);
4768 }
4769
4782
4787
4804
4806 {
4808 foreach (TSource item in first)
4809 {
4810 if (set.Add(item))
4811 {
4812 yield return item;
4813 }
4814 }
4815 }
4816
4828
4829 public static TSource First<TSource>(this IEnumerable<TSource> source)
4830 {
4831 bool found;
4832 TSource result = source.TryGetFirst(out found);
4833 if (!found)
4834 {
4836 }
4837 return result;
4838 }
4839
4841 {
4842 bool found;
4843 TSource result = source.TryGetFirst(predicate, out found);
4844 if (!found)
4845 {
4847 }
4848 return result;
4849 }
4850
4852 {
4853 bool found;
4854 return source.TryGetFirst(out found);
4855 }
4856
4858 {
4859 bool found;
4860 TSource result = source.TryGetFirst(out found);
4861 if (!found)
4862 {
4863 return defaultValue;
4864 }
4865 return result;
4866 }
4867
4869 {
4870 bool found;
4871 return source.TryGetFirst(predicate, out found);
4872 }
4873
4875 {
4876 bool found;
4877 TSource result = source.TryGetFirst(predicate, out found);
4878 if (!found)
4879 {
4880 return defaultValue;
4881 }
4882 return result;
4883 }
4884
4885 private static TSource TryGetFirst<TSource>(this IEnumerable<TSource> source, out bool found)
4886 {
4887 if (source == null)
4888 {
4890 }
4892 {
4893 return partition.TryGetFirst(out found);
4894 }
4896 {
4897 if (list.Count > 0)
4898 {
4899 found = true;
4900 return list[0];
4901 }
4902 }
4903 else
4904 {
4905 using IEnumerator<TSource> enumerator = source.GetEnumerator();
4906 if (enumerator.MoveNext())
4907 {
4908 found = true;
4909 return enumerator.Current;
4910 }
4911 }
4912 found = false;
4913 return default(TSource);
4914 }
4915
4917 {
4918 if (source == null)
4919 {
4921 }
4922 if (predicate == null)
4923 {
4925 }
4926 foreach (TSource item in source)
4927 {
4928 if (predicate(item))
4929 {
4930 found = true;
4931 return item;
4932 }
4933 }
4934 found = false;
4935 return default(TSource);
4936 }
4937
4942
4947
4952
4957
4962
4967
4972
4977
5002
5027
5042
5044 {
5045 return first.Intersect(second, null);
5046 }
5047
5049 {
5050 if (first == null)
5051 {
5053 }
5054 if (second == null)
5055 {
5057 }
5058 return IntersectIterator(first, second, comparer);
5059 }
5060
5065
5082
5084 {
5086 foreach (TSource item in first)
5087 {
5088 if (set.Remove(item))
5089 {
5090 yield return item;
5091 }
5092 }
5093 }
5094
5096 {
5098 foreach (TSource item in first)
5099 {
5100 if (set.Remove(keySelector(item)))
5101 {
5102 yield return item;
5103 }
5104 }
5105 }
5106
5131
5156
5158 {
5160 if (!e.MoveNext())
5161 {
5162 yield break;
5163 }
5165 if (lookup.Count == 0)
5166 {
5167 yield break;
5168 }
5169 do
5170 {
5171 TOuter item = e.Current;
5173 if (grouping != null)
5174 {
5175 int count = grouping._count;
5176 TInner[] elements = grouping._elements;
5177 int i = 0;
5178 while (i != count)
5179 {
5180 yield return resultSelector(item, elements[i]);
5181 int num = i + 1;
5182 i = num;
5183 }
5184 }
5185 }
5186 while (e.MoveNext());
5187 }
5188
5189 public static TSource Last<TSource>(this IEnumerable<TSource> source)
5190 {
5191 bool found;
5192 TSource result = source.TryGetLast(out found);
5193 if (!found)
5194 {
5196 }
5197 return result;
5198 }
5199
5201 {
5202 bool found;
5203 TSource result = source.TryGetLast(predicate, out found);
5204 if (!found)
5205 {
5207 }
5208 return result;
5209 }
5210
5212 {
5213 bool found;
5214 return source.TryGetLast(out found);
5215 }
5216
5218 {
5219 bool found;
5220 TSource result = source.TryGetLast(out found);
5221 if (!found)
5222 {
5223 return defaultValue;
5224 }
5225 return result;
5226 }
5227
5229 {
5230 bool found;
5231 return source.TryGetLast(predicate, out found);
5232 }
5233
5235 {
5236 bool found;
5237 TSource result = source.TryGetLast(predicate, out found);
5238 if (!found)
5239 {
5240 return defaultValue;
5241 }
5242 return result;
5243 }
5244
5245 private static TSource TryGetLast<TSource>(this IEnumerable<TSource> source, out bool found)
5246 {
5247 if (source == null)
5248 {
5250 }
5252 {
5253 return partition.TryGetLast(out found);
5254 }
5255 if (source is IList<TSource> { Count: var count } list)
5256 {
5257 if (count > 0)
5258 {
5259 found = true;
5260 return list[count - 1];
5261 }
5262 }
5263 else
5264 {
5265 using IEnumerator<TSource> enumerator = source.GetEnumerator();
5266 if (enumerator.MoveNext())
5267 {
5268 TSource current;
5269 do
5270 {
5271 current = enumerator.Current;
5272 }
5273 while (enumerator.MoveNext());
5274 found = true;
5275 return current;
5276 }
5277 }
5278 found = false;
5279 return default(TSource);
5280 }
5281
5283 {
5284 if (source == null)
5285 {
5287 }
5288 if (predicate == null)
5289 {
5291 }
5293 {
5294 return orderedEnumerable.TryGetLast(predicate, out found);
5295 }
5297 {
5298 for (int num = list.Count - 1; num >= 0; num--)
5299 {
5300 TSource val = list[num];
5301 if (predicate(val))
5302 {
5303 found = true;
5304 return val;
5305 }
5306 }
5307 }
5308 else
5309 {
5310 using IEnumerator<TSource> enumerator = source.GetEnumerator();
5311 while (enumerator.MoveNext())
5312 {
5313 TSource val2 = enumerator.Current;
5314 if (!predicate(val2))
5315 {
5316 continue;
5317 }
5318 while (enumerator.MoveNext())
5319 {
5320 TSource current = enumerator.Current;
5321 if (predicate(current))
5322 {
5323 val2 = current;
5324 }
5325 }
5326 found = true;
5327 return val2;
5328 }
5329 }
5330 found = false;
5331 return default(TSource);
5332 }
5333
5338
5351
5356
5373
5374 public static int Max(this IEnumerable<int> source)
5375 {
5376 if (source == null)
5377 {
5379 }
5381 if (!enumerator.MoveNext())
5382 {
5384 }
5385 int num = enumerator.Current;
5386 while (enumerator.MoveNext())
5387 {
5388 int current = enumerator.Current;
5389 if (current > num)
5390 {
5391 num = current;
5392 }
5393 }
5394 return num;
5395 }
5396
5397 public static int? Max(this IEnumerable<int?> source)
5398 {
5399 if (source == null)
5400 {
5402 }
5403 int? result = null;
5405 {
5406 do
5407 {
5408 if (!enumerator.MoveNext())
5409 {
5410 return result;
5411 }
5412 result = enumerator.Current;
5413 }
5414 while (!result.HasValue);
5415 int num = result.GetValueOrDefault();
5416 if (num >= 0)
5417 {
5418 while (enumerator.MoveNext())
5419 {
5420 int? current = enumerator.Current;
5421 int valueOrDefault = current.GetValueOrDefault();
5422 if (valueOrDefault > num)
5423 {
5424 num = valueOrDefault;
5425 result = current;
5426 }
5427 }
5428 }
5429 else
5430 {
5431 while (enumerator.MoveNext())
5432 {
5433 int? current2 = enumerator.Current;
5434 int valueOrDefault2 = current2.GetValueOrDefault();
5435 if (current2.HasValue && valueOrDefault2 > num)
5436 {
5437 num = valueOrDefault2;
5438 result = current2;
5439 }
5440 }
5441 }
5442 }
5443 return result;
5444 }
5445
5446 public static long Max(this IEnumerable<long> source)
5447 {
5448 if (source == null)
5449 {
5451 }
5453 if (!enumerator.MoveNext())
5454 {
5456 }
5457 long num = enumerator.Current;
5458 while (enumerator.MoveNext())
5459 {
5460 long current = enumerator.Current;
5461 if (current > num)
5462 {
5463 num = current;
5464 }
5465 }
5466 return num;
5467 }
5468
5469 public static long? Max(this IEnumerable<long?> source)
5470 {
5471 if (source == null)
5472 {
5474 }
5475 long? result = null;
5477 {
5478 do
5479 {
5480 if (!enumerator.MoveNext())
5481 {
5482 return result;
5483 }
5484 result = enumerator.Current;
5485 }
5486 while (!result.HasValue);
5487 long num = result.GetValueOrDefault();
5488 if (num >= 0)
5489 {
5490 while (enumerator.MoveNext())
5491 {
5492 long? current = enumerator.Current;
5493 long valueOrDefault = current.GetValueOrDefault();
5494 if (valueOrDefault > num)
5495 {
5496 num = valueOrDefault;
5497 result = current;
5498 }
5499 }
5500 }
5501 else
5502 {
5503 while (enumerator.MoveNext())
5504 {
5505 long? current2 = enumerator.Current;
5506 long valueOrDefault2 = current2.GetValueOrDefault();
5507 if (current2.HasValue && valueOrDefault2 > num)
5508 {
5509 num = valueOrDefault2;
5510 result = current2;
5511 }
5512 }
5513 }
5514 }
5515 return result;
5516 }
5517
5518 public static double Max(this IEnumerable<double> source)
5519 {
5520 if (source == null)
5521 {
5523 }
5524 using IEnumerator<double> enumerator = source.GetEnumerator();
5525 if (!enumerator.MoveNext())
5526 {
5528 }
5529 double num = enumerator.Current;
5530 while (double.IsNaN(num))
5531 {
5532 if (!enumerator.MoveNext())
5533 {
5534 return num;
5535 }
5536 num = enumerator.Current;
5537 }
5538 while (enumerator.MoveNext())
5539 {
5540 double current = enumerator.Current;
5541 if (current > num)
5542 {
5543 num = current;
5544 }
5545 }
5546 return num;
5547 }
5548
5549 public static double? Max(this IEnumerable<double?> source)
5550 {
5551 if (source == null)
5552 {
5554 }
5555 double? result = null;
5556 using IEnumerator<double?> enumerator = source.GetEnumerator();
5557 while (enumerator.MoveNext())
5558 {
5559 result = enumerator.Current;
5560 if (!result.HasValue)
5561 {
5562 continue;
5563 }
5564 double num = result.GetValueOrDefault();
5565 while (double.IsNaN(num))
5566 {
5567 if (!enumerator.MoveNext())
5568 {
5569 return result;
5570 }
5571 double? current = enumerator.Current;
5572 if (current.HasValue)
5573 {
5574 double? num2 = (result = current);
5575 num = num2.GetValueOrDefault();
5576 }
5577 }
5578 while (enumerator.MoveNext())
5579 {
5580 double? current2 = enumerator.Current;
5581 double valueOrDefault = current2.GetValueOrDefault();
5582 if (current2.HasValue && valueOrDefault > num)
5583 {
5584 num = valueOrDefault;
5585 result = current2;
5586 }
5587 }
5588 return result;
5589 }
5590 return result;
5591 }
5592
5593 public static float Max(this IEnumerable<float> source)
5594 {
5595 if (source == null)
5596 {
5598 }
5599 using IEnumerator<float> enumerator = source.GetEnumerator();
5600 if (!enumerator.MoveNext())
5601 {
5603 }
5604 float num = enumerator.Current;
5605 while (float.IsNaN(num))
5606 {
5607 if (!enumerator.MoveNext())
5608 {
5609 return num;
5610 }
5611 num = enumerator.Current;
5612 }
5613 while (enumerator.MoveNext())
5614 {
5615 float current = enumerator.Current;
5616 if (current > num)
5617 {
5618 num = current;
5619 }
5620 }
5621 return num;
5622 }
5623
5624 public static float? Max(this IEnumerable<float?> source)
5625 {
5626 if (source == null)
5627 {
5629 }
5630 float? result = null;
5631 using IEnumerator<float?> enumerator = source.GetEnumerator();
5632 while (enumerator.MoveNext())
5633 {
5634 result = enumerator.Current;
5635 if (!result.HasValue)
5636 {
5637 continue;
5638 }
5639 float num = result.GetValueOrDefault();
5640 while (float.IsNaN(num))
5641 {
5642 if (!enumerator.MoveNext())
5643 {
5644 return result;
5645 }
5646 float? current = enumerator.Current;
5647 if (current.HasValue)
5648 {
5649 float? num2 = (result = current);
5650 num = num2.GetValueOrDefault();
5651 }
5652 }
5653 while (enumerator.MoveNext())
5654 {
5655 float? current2 = enumerator.Current;
5656 float valueOrDefault = current2.GetValueOrDefault();
5657 if (current2.HasValue && valueOrDefault > num)
5658 {
5659 num = valueOrDefault;
5660 result = current2;
5661 }
5662 }
5663 return result;
5664 }
5665 return result;
5666 }
5667
5668 public static decimal Max(this IEnumerable<decimal> source)
5669 {
5670 if (source == null)
5671 {
5673 }
5674 using IEnumerator<decimal> enumerator = source.GetEnumerator();
5675 if (!enumerator.MoveNext())
5676 {
5678 }
5679 decimal num = enumerator.Current;
5680 while (enumerator.MoveNext())
5681 {
5682 decimal current = enumerator.Current;
5683 if (current > num)
5684 {
5685 num = current;
5686 }
5687 }
5688 return num;
5689 }
5690
5691 public static decimal? Max(this IEnumerable<decimal?> source)
5692 {
5693 if (source == null)
5694 {
5696 }
5697 decimal? result = null;
5698 using IEnumerator<decimal?> enumerator = source.GetEnumerator();
5699 while (enumerator.MoveNext())
5700 {
5701 result = enumerator.Current;
5702 if (!result.HasValue)
5703 {
5704 continue;
5705 }
5706 decimal num = result.GetValueOrDefault();
5707 while (enumerator.MoveNext())
5708 {
5709 decimal? current = enumerator.Current;
5710 decimal valueOrDefault = current.GetValueOrDefault();
5711 if (current.HasValue && valueOrDefault > num)
5712 {
5713 num = valueOrDefault;
5714 result = current;
5715 }
5716 }
5717 return result;
5718 }
5719 return result;
5720 }
5721
5722 public static TSource? Max<TSource>(this IEnumerable<TSource> source)
5723 {
5724 return source.Max((IComparer<TSource>?)null);
5725 }
5726
5728 {
5729 if (source == null)
5730 {
5732 }
5733 if (comparer == null)
5734 {
5735 comparer = Comparer<TSource>.Default;
5736 }
5737 TSource val = default(TSource);
5739 {
5740 if (val == null)
5741 {
5742 do
5743 {
5744 if (!enumerator.MoveNext())
5745 {
5746 return val;
5747 }
5748 val = enumerator.Current;
5749 }
5750 while (val == null);
5751 while (enumerator.MoveNext())
5752 {
5753 TSource current = enumerator.Current;
5754 if (current != null && comparer.Compare(current, val) > 0)
5755 {
5756 val = current;
5757 }
5758 }
5759 }
5760 else
5761 {
5762 if (!enumerator.MoveNext())
5763 {
5765 }
5766 val = enumerator.Current;
5768 {
5769 while (enumerator.MoveNext())
5770 {
5771 TSource current2 = enumerator.Current;
5772 if (Comparer<TSource>.Default.Compare(current2, val) > 0)
5773 {
5774 val = current2;
5775 }
5776 }
5777 }
5778 else
5779 {
5780 while (enumerator.MoveNext())
5781 {
5782 TSource current3 = enumerator.Current;
5783 if (comparer.Compare(current3, val) > 0)
5784 {
5785 val = current3;
5786 }
5787 }
5788 }
5789 }
5790 }
5791 return val;
5792 }
5793
5795 {
5796 return source.MaxBy(keySelector, null);
5797 }
5798
5800 {
5801 if (source == null)
5802 {
5804 }
5805 if (keySelector == null)
5806 {
5808 }
5809 if (comparer == null)
5810 {
5811 comparer = Comparer<TKey>.Default;
5812 }
5813 using IEnumerator<TSource> enumerator = source.GetEnumerator();
5814 if (!enumerator.MoveNext())
5815 {
5816 if (default(TSource) == null)
5817 {
5818 return default(TSource);
5819 }
5821 }
5822 TSource val = enumerator.Current;
5823 TKey val2 = keySelector(val);
5824 if (default(TKey) == null)
5825 {
5826 while (val2 == null)
5827 {
5828 if (!enumerator.MoveNext())
5829 {
5830 return val;
5831 }
5832 val = enumerator.Current;
5833 val2 = keySelector(val);
5834 }
5835 while (enumerator.MoveNext())
5836 {
5837 TSource current = enumerator.Current;
5838 TKey val3 = keySelector(current);
5839 if (val3 != null && comparer.Compare(val3, val2) > 0)
5840 {
5841 val2 = val3;
5842 val = current;
5843 }
5844 }
5845 }
5846 else if (comparer == Comparer<TKey>.Default)
5847 {
5848 while (enumerator.MoveNext())
5849 {
5850 TSource current2 = enumerator.Current;
5851 TKey val4 = keySelector(current2);
5852 if (Comparer<TKey>.Default.Compare(val4, val2) > 0)
5853 {
5854 val2 = val4;
5855 val = current2;
5856 }
5857 }
5858 }
5859 else
5860 {
5861 while (enumerator.MoveNext())
5862 {
5863 TSource current3 = enumerator.Current;
5864 TKey val5 = keySelector(current3);
5865 if (comparer.Compare(val5, val2) > 0)
5866 {
5867 val2 = val5;
5868 val = current3;
5869 }
5870 }
5871 }
5872 return val;
5873 }
5874
5876 {
5877 if (source == null)
5878 {
5880 }
5881 if (selector == null)
5882 {
5884 }
5885 using IEnumerator<TSource> enumerator = source.GetEnumerator();
5886 if (!enumerator.MoveNext())
5887 {
5889 }
5890 int num = selector(enumerator.Current);
5891 while (enumerator.MoveNext())
5892 {
5893 int num2 = selector(enumerator.Current);
5894 if (num2 > num)
5895 {
5896 num = num2;
5897 }
5898 }
5899 return num;
5900 }
5901
5903 {
5904 if (source == null)
5905 {
5907 }
5908 if (selector == null)
5909 {
5911 }
5912 int? result = null;
5914 {
5915 do
5916 {
5917 if (!enumerator.MoveNext())
5918 {
5919 return result;
5920 }
5921 result = selector(enumerator.Current);
5922 }
5923 while (!result.HasValue);
5924 int num = result.GetValueOrDefault();
5925 if (num >= 0)
5926 {
5927 while (enumerator.MoveNext())
5928 {
5929 int? num2 = selector(enumerator.Current);
5930 int valueOrDefault = num2.GetValueOrDefault();
5931 if (valueOrDefault > num)
5932 {
5933 num = valueOrDefault;
5934 result = num2;
5935 }
5936 }
5937 }
5938 else
5939 {
5940 while (enumerator.MoveNext())
5941 {
5942 int? num3 = selector(enumerator.Current);
5943 int valueOrDefault2 = num3.GetValueOrDefault();
5944 if (num3.HasValue && valueOrDefault2 > num)
5945 {
5946 num = valueOrDefault2;
5947 result = num3;
5948 }
5949 }
5950 }
5951 }
5952 return result;
5953 }
5954
5956 {
5957 if (source == null)
5958 {
5960 }
5961 if (selector == null)
5962 {
5964 }
5965 using IEnumerator<TSource> enumerator = source.GetEnumerator();
5966 if (!enumerator.MoveNext())
5967 {
5969 }
5970 long num = selector(enumerator.Current);
5971 while (enumerator.MoveNext())
5972 {
5973 long num2 = selector(enumerator.Current);
5974 if (num2 > num)
5975 {
5976 num = num2;
5977 }
5978 }
5979 return num;
5980 }
5981
5983 {
5984 if (source == null)
5985 {
5987 }
5988 if (selector == null)
5989 {
5991 }
5992 long? result = null;
5994 {
5995 do
5996 {
5997 if (!enumerator.MoveNext())
5998 {
5999 return result;
6000 }
6001 result = selector(enumerator.Current);
6002 }
6003 while (!result.HasValue);
6004 long num = result.GetValueOrDefault();
6005 if (num >= 0)
6006 {
6007 while (enumerator.MoveNext())
6008 {
6009 long? num2 = selector(enumerator.Current);
6010 long valueOrDefault = num2.GetValueOrDefault();
6011 if (valueOrDefault > num)
6012 {
6013 num = valueOrDefault;
6014 result = num2;
6015 }
6016 }
6017 }
6018 else
6019 {
6020 while (enumerator.MoveNext())
6021 {
6022 long? num3 = selector(enumerator.Current);
6023 long valueOrDefault2 = num3.GetValueOrDefault();
6024 if (num3.HasValue && valueOrDefault2 > num)
6025 {
6026 num = valueOrDefault2;
6027 result = num3;
6028 }
6029 }
6030 }
6031 }
6032 return result;
6033 }
6034
6036 {
6037 if (source == null)
6038 {
6040 }
6041 if (selector == null)
6042 {
6044 }
6045 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6046 if (!enumerator.MoveNext())
6047 {
6049 }
6050 float num = selector(enumerator.Current);
6051 while (float.IsNaN(num))
6052 {
6053 if (!enumerator.MoveNext())
6054 {
6055 return num;
6056 }
6057 num = selector(enumerator.Current);
6058 }
6059 while (enumerator.MoveNext())
6060 {
6061 float num2 = selector(enumerator.Current);
6062 if (num2 > num)
6063 {
6064 num = num2;
6065 }
6066 }
6067 return num;
6068 }
6069
6071 {
6072 if (source == null)
6073 {
6075 }
6076 if (selector == null)
6077 {
6079 }
6080 float? result = null;
6081 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6082 while (enumerator.MoveNext())
6083 {
6084 result = selector(enumerator.Current);
6085 if (!result.HasValue)
6086 {
6087 continue;
6088 }
6089 float num = result.GetValueOrDefault();
6090 while (float.IsNaN(num))
6091 {
6092 if (!enumerator.MoveNext())
6093 {
6094 return result;
6095 }
6096 float? num2 = selector(enumerator.Current);
6097 if (num2.HasValue)
6098 {
6099 float? num3 = (result = num2);
6100 num = num3.GetValueOrDefault();
6101 }
6102 }
6103 while (enumerator.MoveNext())
6104 {
6105 float? num4 = selector(enumerator.Current);
6106 float valueOrDefault = num4.GetValueOrDefault();
6107 if (num4.HasValue && valueOrDefault > num)
6108 {
6109 num = valueOrDefault;
6110 result = num4;
6111 }
6112 }
6113 return result;
6114 }
6115 return result;
6116 }
6117
6119 {
6120 if (source == null)
6121 {
6123 }
6124 if (selector == null)
6125 {
6127 }
6128 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6129 if (!enumerator.MoveNext())
6130 {
6132 }
6133 double num = selector(enumerator.Current);
6134 while (double.IsNaN(num))
6135 {
6136 if (!enumerator.MoveNext())
6137 {
6138 return num;
6139 }
6140 num = selector(enumerator.Current);
6141 }
6142 while (enumerator.MoveNext())
6143 {
6144 double num2 = selector(enumerator.Current);
6145 if (num2 > num)
6146 {
6147 num = num2;
6148 }
6149 }
6150 return num;
6151 }
6152
6154 {
6155 if (source == null)
6156 {
6158 }
6159 if (selector == null)
6160 {
6162 }
6163 double? result = null;
6164 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6165 while (enumerator.MoveNext())
6166 {
6167 result = selector(enumerator.Current);
6168 if (!result.HasValue)
6169 {
6170 continue;
6171 }
6172 double num = result.GetValueOrDefault();
6173 while (double.IsNaN(num))
6174 {
6175 if (!enumerator.MoveNext())
6176 {
6177 return result;
6178 }
6179 double? num2 = selector(enumerator.Current);
6180 if (num2.HasValue)
6181 {
6182 double? num3 = (result = num2);
6183 num = num3.GetValueOrDefault();
6184 }
6185 }
6186 while (enumerator.MoveNext())
6187 {
6188 double? num4 = selector(enumerator.Current);
6189 double valueOrDefault = num4.GetValueOrDefault();
6190 if (num4.HasValue && valueOrDefault > num)
6191 {
6192 num = valueOrDefault;
6193 result = num4;
6194 }
6195 }
6196 return result;
6197 }
6198 return result;
6199 }
6200
6202 {
6203 if (source == null)
6204 {
6206 }
6207 if (selector == null)
6208 {
6210 }
6211 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6212 if (!enumerator.MoveNext())
6213 {
6215 }
6216 decimal num = selector(enumerator.Current);
6217 while (enumerator.MoveNext())
6218 {
6219 decimal num2 = selector(enumerator.Current);
6220 if (num2 > num)
6221 {
6222 num = num2;
6223 }
6224 }
6225 return num;
6226 }
6227
6229 {
6230 if (source == null)
6231 {
6233 }
6234 if (selector == null)
6235 {
6237 }
6238 decimal? result = null;
6239 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6240 while (enumerator.MoveNext())
6241 {
6242 result = selector(enumerator.Current);
6243 if (!result.HasValue)
6244 {
6245 continue;
6246 }
6247 decimal num = result.GetValueOrDefault();
6248 while (enumerator.MoveNext())
6249 {
6250 decimal? num2 = selector(enumerator.Current);
6251 decimal valueOrDefault = num2.GetValueOrDefault();
6252 if (num2.HasValue && valueOrDefault > num)
6253 {
6254 num = valueOrDefault;
6255 result = num2;
6256 }
6257 }
6258 return result;
6259 }
6260 return result;
6261 }
6262
6264 {
6265 if (source == null)
6266 {
6268 }
6269 if (selector == null)
6270 {
6272 }
6273 TResult val = default(TResult);
6275 {
6276 if (val == null)
6277 {
6278 do
6279 {
6280 if (!enumerator.MoveNext())
6281 {
6282 return val;
6283 }
6284 val = selector(enumerator.Current);
6285 }
6286 while (val == null);
6287 Comparer<TResult> @default = Comparer<TResult>.Default;
6288 while (enumerator.MoveNext())
6289 {
6290 TResult val2 = selector(enumerator.Current);
6291 if (val2 != null && @default.Compare(val2, val) > 0)
6292 {
6293 val = val2;
6294 }
6295 }
6296 }
6297 else
6298 {
6299 if (!enumerator.MoveNext())
6300 {
6302 }
6303 val = selector(enumerator.Current);
6304 while (enumerator.MoveNext())
6305 {
6306 TResult val3 = selector(enumerator.Current);
6307 if (Comparer<TResult>.Default.Compare(val3, val) > 0)
6308 {
6309 val = val3;
6310 }
6311 }
6312 }
6313 }
6314 return val;
6315 }
6316
6317 public static int Min(this IEnumerable<int> source)
6318 {
6319 if (source == null)
6320 {
6322 }
6324 if (!enumerator.MoveNext())
6325 {
6327 }
6328 int num = enumerator.Current;
6329 while (enumerator.MoveNext())
6330 {
6331 int current = enumerator.Current;
6332 if (current < num)
6333 {
6334 num = current;
6335 }
6336 }
6337 return num;
6338 }
6339
6340 public static int? Min(this IEnumerable<int?> source)
6341 {
6342 if (source == null)
6343 {
6345 }
6346 int? result = null;
6348 while (enumerator.MoveNext())
6349 {
6350 result = enumerator.Current;
6351 if (!result.HasValue)
6352 {
6353 continue;
6354 }
6355 int num = result.GetValueOrDefault();
6356 while (enumerator.MoveNext())
6357 {
6358 int? current = enumerator.Current;
6359 int valueOrDefault = current.GetValueOrDefault();
6360 if (current.HasValue && valueOrDefault < num)
6361 {
6362 num = valueOrDefault;
6363 result = current;
6364 }
6365 }
6366 return result;
6367 }
6368 return result;
6369 }
6370
6371 public static long Min(this IEnumerable<long> source)
6372 {
6373 if (source == null)
6374 {
6376 }
6378 if (!enumerator.MoveNext())
6379 {
6381 }
6382 long num = enumerator.Current;
6383 while (enumerator.MoveNext())
6384 {
6385 long current = enumerator.Current;
6386 if (current < num)
6387 {
6388 num = current;
6389 }
6390 }
6391 return num;
6392 }
6393
6394 public static long? Min(this IEnumerable<long?> source)
6395 {
6396 if (source == null)
6397 {
6399 }
6400 long? result = null;
6401 using IEnumerator<long?> enumerator = source.GetEnumerator();
6402 while (enumerator.MoveNext())
6403 {
6404 result = enumerator.Current;
6405 if (!result.HasValue)
6406 {
6407 continue;
6408 }
6409 long num = result.GetValueOrDefault();
6410 while (enumerator.MoveNext())
6411 {
6412 long? current = enumerator.Current;
6413 long valueOrDefault = current.GetValueOrDefault();
6414 if (current.HasValue && valueOrDefault < num)
6415 {
6416 num = valueOrDefault;
6417 result = current;
6418 }
6419 }
6420 return result;
6421 }
6422 return result;
6423 }
6424
6425 public static float Min(this IEnumerable<float> source)
6426 {
6427 if (source == null)
6428 {
6430 }
6431 using IEnumerator<float> enumerator = source.GetEnumerator();
6432 if (!enumerator.MoveNext())
6433 {
6435 }
6436 float num = enumerator.Current;
6437 if (float.IsNaN(num))
6438 {
6439 return num;
6440 }
6441 while (enumerator.MoveNext())
6442 {
6443 float current = enumerator.Current;
6444 if (current < num)
6445 {
6446 num = current;
6447 }
6448 else if (float.IsNaN(current))
6449 {
6450 return current;
6451 }
6452 }
6453 return num;
6454 }
6455
6456 public static float? Min(this IEnumerable<float?> source)
6457 {
6458 if (source == null)
6459 {
6461 }
6462 float? result = null;
6463 using IEnumerator<float?> enumerator = source.GetEnumerator();
6464 while (enumerator.MoveNext())
6465 {
6466 result = enumerator.Current;
6467 if (!result.HasValue)
6468 {
6469 continue;
6470 }
6471 float num = result.GetValueOrDefault();
6472 if (float.IsNaN(num))
6473 {
6474 return result;
6475 }
6476 while (enumerator.MoveNext())
6477 {
6478 float? current = enumerator.Current;
6479 if (current.HasValue)
6480 {
6481 float valueOrDefault = current.GetValueOrDefault();
6482 if (valueOrDefault < num)
6483 {
6484 num = valueOrDefault;
6485 result = current;
6486 }
6487 else if (float.IsNaN(valueOrDefault))
6488 {
6489 return current;
6490 }
6491 }
6492 }
6493 return result;
6494 }
6495 return result;
6496 }
6497
6498 public static double Min(this IEnumerable<double> source)
6499 {
6500 if (source == null)
6501 {
6503 }
6504 using IEnumerator<double> enumerator = source.GetEnumerator();
6505 if (!enumerator.MoveNext())
6506 {
6508 }
6509 double num = enumerator.Current;
6510 if (double.IsNaN(num))
6511 {
6512 return num;
6513 }
6514 while (enumerator.MoveNext())
6515 {
6516 double current = enumerator.Current;
6517 if (current < num)
6518 {
6519 num = current;
6520 }
6521 else if (double.IsNaN(current))
6522 {
6523 return current;
6524 }
6525 }
6526 return num;
6527 }
6528
6529 public static double? Min(this IEnumerable<double?> source)
6530 {
6531 if (source == null)
6532 {
6534 }
6535 double? result = null;
6536 using IEnumerator<double?> enumerator = source.GetEnumerator();
6537 while (enumerator.MoveNext())
6538 {
6539 result = enumerator.Current;
6540 if (!result.HasValue)
6541 {
6542 continue;
6543 }
6544 double num = result.GetValueOrDefault();
6545 if (double.IsNaN(num))
6546 {
6547 return result;
6548 }
6549 while (enumerator.MoveNext())
6550 {
6551 double? current = enumerator.Current;
6552 if (current.HasValue)
6553 {
6554 double valueOrDefault = current.GetValueOrDefault();
6555 if (valueOrDefault < num)
6556 {
6557 num = valueOrDefault;
6558 result = current;
6559 }
6560 else if (double.IsNaN(valueOrDefault))
6561 {
6562 return current;
6563 }
6564 }
6565 }
6566 return result;
6567 }
6568 return result;
6569 }
6570
6571 public static decimal Min(this IEnumerable<decimal> source)
6572 {
6573 if (source == null)
6574 {
6576 }
6577 using IEnumerator<decimal> enumerator = source.GetEnumerator();
6578 if (!enumerator.MoveNext())
6579 {
6581 }
6582 decimal num = enumerator.Current;
6583 while (enumerator.MoveNext())
6584 {
6585 decimal current = enumerator.Current;
6586 if (current < num)
6587 {
6588 num = current;
6589 }
6590 }
6591 return num;
6592 }
6593
6594 public static decimal? Min(this IEnumerable<decimal?> source)
6595 {
6596 if (source == null)
6597 {
6599 }
6600 decimal? result = null;
6601 using IEnumerator<decimal?> enumerator = source.GetEnumerator();
6602 while (enumerator.MoveNext())
6603 {
6604 result = enumerator.Current;
6605 if (!result.HasValue)
6606 {
6607 continue;
6608 }
6609 decimal num = result.GetValueOrDefault();
6610 while (enumerator.MoveNext())
6611 {
6612 decimal? current = enumerator.Current;
6613 decimal valueOrDefault = current.GetValueOrDefault();
6614 if (current.HasValue && valueOrDefault < num)
6615 {
6616 num = valueOrDefault;
6617 result = current;
6618 }
6619 }
6620 return result;
6621 }
6622 return result;
6623 }
6624
6625 public static TSource? Min<TSource>(this IEnumerable<TSource> source)
6626 {
6627 return source.Min((IComparer<TSource>?)null);
6628 }
6629
6631 {
6632 if (source == null)
6633 {
6635 }
6636 if (comparer == null)
6637 {
6638 comparer = Comparer<TSource>.Default;
6639 }
6640 TSource val = default(TSource);
6642 {
6643 if (val == null)
6644 {
6645 do
6646 {
6647 if (!enumerator.MoveNext())
6648 {
6649 return val;
6650 }
6651 val = enumerator.Current;
6652 }
6653 while (val == null);
6654 while (enumerator.MoveNext())
6655 {
6656 TSource current = enumerator.Current;
6657 if (current != null && comparer.Compare(current, val) < 0)
6658 {
6659 val = current;
6660 }
6661 }
6662 }
6663 else
6664 {
6665 if (!enumerator.MoveNext())
6666 {
6668 }
6669 val = enumerator.Current;
6671 {
6672 while (enumerator.MoveNext())
6673 {
6674 TSource current2 = enumerator.Current;
6675 if (Comparer<TSource>.Default.Compare(current2, val) < 0)
6676 {
6677 val = current2;
6678 }
6679 }
6680 }
6681 else
6682 {
6683 while (enumerator.MoveNext())
6684 {
6685 TSource current3 = enumerator.Current;
6686 if (comparer.Compare(current3, val) < 0)
6687 {
6688 val = current3;
6689 }
6690 }
6691 }
6692 }
6693 }
6694 return val;
6695 }
6696
6698 {
6699 return source.MinBy(keySelector, null);
6700 }
6701
6703 {
6704 if (source == null)
6705 {
6707 }
6708 if (keySelector == null)
6709 {
6711 }
6712 if (comparer == null)
6713 {
6714 comparer = Comparer<TKey>.Default;
6715 }
6716 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6717 if (!enumerator.MoveNext())
6718 {
6719 if (default(TSource) == null)
6720 {
6721 return default(TSource);
6722 }
6724 }
6725 TSource val = enumerator.Current;
6726 TKey val2 = keySelector(val);
6727 if (default(TKey) == null)
6728 {
6729 while (val2 == null)
6730 {
6731 if (!enumerator.MoveNext())
6732 {
6733 return val;
6734 }
6735 val = enumerator.Current;
6736 val2 = keySelector(val);
6737 }
6738 while (enumerator.MoveNext())
6739 {
6740 TSource current = enumerator.Current;
6741 TKey val3 = keySelector(current);
6742 if (val3 != null && comparer.Compare(val3, val2) < 0)
6743 {
6744 val2 = val3;
6745 val = current;
6746 }
6747 }
6748 }
6749 else if (comparer == Comparer<TKey>.Default)
6750 {
6751 while (enumerator.MoveNext())
6752 {
6753 TSource current2 = enumerator.Current;
6754 TKey val4 = keySelector(current2);
6755 if (Comparer<TKey>.Default.Compare(val4, val2) < 0)
6756 {
6757 val2 = val4;
6758 val = current2;
6759 }
6760 }
6761 }
6762 else
6763 {
6764 while (enumerator.MoveNext())
6765 {
6766 TSource current3 = enumerator.Current;
6767 TKey val5 = keySelector(current3);
6768 if (comparer.Compare(val5, val2) < 0)
6769 {
6770 val2 = val5;
6771 val = current3;
6772 }
6773 }
6774 }
6775 return val;
6776 }
6777
6779 {
6780 if (source == null)
6781 {
6783 }
6784 if (selector == null)
6785 {
6787 }
6788 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6789 if (!enumerator.MoveNext())
6790 {
6792 }
6793 int num = selector(enumerator.Current);
6794 while (enumerator.MoveNext())
6795 {
6796 int num2 = selector(enumerator.Current);
6797 if (num2 < num)
6798 {
6799 num = num2;
6800 }
6801 }
6802 return num;
6803 }
6804
6806 {
6807 if (source == null)
6808 {
6810 }
6811 if (selector == null)
6812 {
6814 }
6815 int? result = null;
6816 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6817 while (enumerator.MoveNext())
6818 {
6819 result = selector(enumerator.Current);
6820 if (!result.HasValue)
6821 {
6822 continue;
6823 }
6824 int num = result.GetValueOrDefault();
6825 while (enumerator.MoveNext())
6826 {
6827 int? num2 = selector(enumerator.Current);
6828 int valueOrDefault = num2.GetValueOrDefault();
6829 if (num2.HasValue && valueOrDefault < num)
6830 {
6831 num = valueOrDefault;
6832 result = num2;
6833 }
6834 }
6835 return result;
6836 }
6837 return result;
6838 }
6839
6841 {
6842 if (source == null)
6843 {
6845 }
6846 if (selector == null)
6847 {
6849 }
6850 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6851 if (!enumerator.MoveNext())
6852 {
6854 }
6855 long num = selector(enumerator.Current);
6856 while (enumerator.MoveNext())
6857 {
6858 long num2 = selector(enumerator.Current);
6859 if (num2 < num)
6860 {
6861 num = num2;
6862 }
6863 }
6864 return num;
6865 }
6866
6868 {
6869 if (source == null)
6870 {
6872 }
6873 if (selector == null)
6874 {
6876 }
6877 long? result = null;
6878 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6879 while (enumerator.MoveNext())
6880 {
6881 result = selector(enumerator.Current);
6882 if (!result.HasValue)
6883 {
6884 continue;
6885 }
6886 long num = result.GetValueOrDefault();
6887 while (enumerator.MoveNext())
6888 {
6889 long? num2 = selector(enumerator.Current);
6890 long valueOrDefault = num2.GetValueOrDefault();
6891 if (num2.HasValue && valueOrDefault < num)
6892 {
6893 num = valueOrDefault;
6894 result = num2;
6895 }
6896 }
6897 return result;
6898 }
6899 return result;
6900 }
6901
6903 {
6904 if (source == null)
6905 {
6907 }
6908 if (selector == null)
6909 {
6911 }
6912 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6913 if (!enumerator.MoveNext())
6914 {
6916 }
6917 float num = selector(enumerator.Current);
6918 if (float.IsNaN(num))
6919 {
6920 return num;
6921 }
6922 while (enumerator.MoveNext())
6923 {
6924 float num2 = selector(enumerator.Current);
6925 if (num2 < num)
6926 {
6927 num = num2;
6928 }
6929 else if (float.IsNaN(num2))
6930 {
6931 return num2;
6932 }
6933 }
6934 return num;
6935 }
6936
6938 {
6939 if (source == null)
6940 {
6942 }
6943 if (selector == null)
6944 {
6946 }
6947 float? result = null;
6948 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6949 while (enumerator.MoveNext())
6950 {
6951 result = selector(enumerator.Current);
6952 if (!result.HasValue)
6953 {
6954 continue;
6955 }
6956 float num = result.GetValueOrDefault();
6957 if (float.IsNaN(num))
6958 {
6959 return result;
6960 }
6961 while (enumerator.MoveNext())
6962 {
6963 float? num2 = selector(enumerator.Current);
6964 if (num2.HasValue)
6965 {
6966 float valueOrDefault = num2.GetValueOrDefault();
6967 if (valueOrDefault < num)
6968 {
6969 num = valueOrDefault;
6970 result = num2;
6971 }
6972 else if (float.IsNaN(valueOrDefault))
6973 {
6974 return num2;
6975 }
6976 }
6977 }
6978 return result;
6979 }
6980 return result;
6981 }
6982
6984 {
6985 if (source == null)
6986 {
6988 }
6989 if (selector == null)
6990 {
6992 }
6993 using IEnumerator<TSource> enumerator = source.GetEnumerator();
6994 if (!enumerator.MoveNext())
6995 {
6997 }
6998 double num = selector(enumerator.Current);
6999 if (double.IsNaN(num))
7000 {
7001 return num;
7002 }
7003 while (enumerator.MoveNext())
7004 {
7005 double num2 = selector(enumerator.Current);
7006 if (num2 < num)
7007 {
7008 num = num2;
7009 }
7010 else if (double.IsNaN(num2))
7011 {
7012 return num2;
7013 }
7014 }
7015 return num;
7016 }
7017
7019 {
7020 if (source == null)
7021 {
7023 }
7024 if (selector == null)
7025 {
7027 }
7028 double? result = null;
7029 using IEnumerator<TSource> enumerator = source.GetEnumerator();
7030 while (enumerator.MoveNext())
7031 {
7032 result = selector(enumerator.Current);
7033 if (!result.HasValue)
7034 {
7035 continue;
7036 }
7037 double num = result.GetValueOrDefault();
7038 if (double.IsNaN(num))
7039 {
7040 return result;
7041 }
7042 while (enumerator.MoveNext())
7043 {
7044 double? num2 = selector(enumerator.Current);
7045 if (num2.HasValue)
7046 {
7047 double valueOrDefault = num2.GetValueOrDefault();
7048 if (valueOrDefault < num)
7049 {
7050 num = valueOrDefault;
7051 result = num2;
7052 }
7053 else if (double.IsNaN(valueOrDefault))
7054 {
7055 return num2;
7056 }
7057 }
7058 }
7059 return result;
7060 }
7061 return result;
7062 }
7063
7065 {
7066 if (source == null)
7067 {
7069 }
7070 if (selector == null)
7071 {
7073 }
7074 using IEnumerator<TSource> enumerator = source.GetEnumerator();
7075 if (!enumerator.MoveNext())
7076 {
7078 }
7079 decimal num = selector(enumerator.Current);
7080 while (enumerator.MoveNext())
7081 {
7082 decimal num2 = selector(enumerator.Current);
7083 if (num2 < num)
7084 {
7085 num = num2;
7086 }
7087 }
7088 return num;
7089 }
7090
7092 {
7093 if (source == null)
7094 {
7096 }
7097 if (selector == null)
7098 {
7100 }
7101 decimal? result = null;
7102 using IEnumerator<TSource> enumerator = source.GetEnumerator();
7103 while (enumerator.MoveNext())
7104 {
7105 result = selector(enumerator.Current);
7106 if (!result.HasValue)
7107 {
7108 continue;
7109 }
7110 decimal num = result.GetValueOrDefault();
7111 while (enumerator.MoveNext())
7112 {
7113 decimal? num2 = selector(enumerator.Current);
7114 decimal valueOrDefault = num2.GetValueOrDefault();
7115 if (num2.HasValue && valueOrDefault < num)
7116 {
7117 num = valueOrDefault;
7118 result = num2;
7119 }
7120 }
7121 return result;
7122 }
7123 return result;
7124 }
7125
7127 {
7128 if (source == null)
7129 {
7131 }
7132 if (selector == null)
7133 {
7135 }
7136 TResult val = default(TResult);
7138 {
7139 if (val == null)
7140 {
7141 do
7142 {
7143 if (!enumerator.MoveNext())
7144 {
7145 return val;
7146 }
7147 val = selector(enumerator.Current);
7148 }
7149 while (val == null);
7150 Comparer<TResult> @default = Comparer<TResult>.Default;
7151 while (enumerator.MoveNext())
7152 {
7153 TResult val2 = selector(enumerator.Current);
7154 if (val2 != null && @default.Compare(val2, val) < 0)
7155 {
7156 val = val2;
7157 }
7158 }
7159 }
7160 else
7161 {
7162 if (!enumerator.MoveNext())
7163 {
7165 }
7166 val = selector(enumerator.Current);
7167 while (enumerator.MoveNext())
7168 {
7169 TResult val3 = selector(enumerator.Current);
7170 if (Comparer<TResult>.Default.Compare(val3, val) < 0)
7171 {
7172 val = val3;
7173 }
7174 }
7175 }
7176 }
7177 return val;
7178 }
7179
7184
7189
7194
7199
7201 {
7202 if (source == null)
7203 {
7205 }
7206 return source.CreateOrderedEnumerable(keySelector, null, descending: false);
7207 }
7208
7217
7219 {
7220 if (source == null)
7221 {
7223 }
7224 return source.CreateOrderedEnumerable(keySelector, null, descending: true);
7225 }
7226
7235
7236 public static IEnumerable<int> Range(int start, int count)
7237 {
7238 long num = (long)start + (long)count - 1;
7239 if (count < 0 || num > int.MaxValue)
7240 {
7242 }
7243 if (count == 0)
7244 {
7245 return Empty<int>();
7246 }
7247 return new RangeIterator(start, count);
7248 }
7249
7251 {
7252 if (count < 0)
7253 {
7255 }
7256 if (count == 0)
7257 {
7258 return Empty<TResult>();
7259 }
7260 return new RepeatIterator<TResult>(element, count);
7261 }
7262
7264 {
7265 if (source == null)
7266 {
7268 }
7269 return new ReverseIterator<TSource>(source);
7270 }
7271
7273 {
7274 if (source == null)
7275 {
7277 }
7278 if (selector == null)
7279 {
7281 }
7283 {
7284 return iterator.Select(selector);
7285 }
7287 {
7288 if (source is TSource[] array)
7289 {
7290 if (array.Length != 0)
7291 {
7293 }
7294 return Empty<TResult>();
7295 }
7297 {
7299 }
7301 }
7303 {
7304 IEnumerable<TResult> result = null;
7306 if (result != null)
7307 {
7308 return result;
7309 }
7310 }
7312 }
7313
7328
7341
7343 {
7344 int index = -1;
7345 foreach (TSource item in source)
7346 {
7347 index = checked(index + 1);
7348 yield return selector(item, index);
7349 }
7350 }
7351
7364
7366 {
7367 if (source == null)
7368 {
7370 }
7371 if (selector == null)
7372 {
7374 }
7376 }
7377
7379 {
7380 int index = -1;
7381 foreach (TSource item in source)
7382 {
7383 index = checked(index + 1);
7384 foreach (TResult item2 in selector(item, index))
7385 {
7386 yield return item2;
7387 }
7388 }
7389 }
7390
7407
7409 {
7410 int index = -1;
7411 foreach (TSource element in source)
7412 {
7413 index = checked(index + 1);
7414 foreach (TCollection item in collectionSelector(element, index))
7415 {
7416 yield return resultSelector(element, item);
7417 }
7418 }
7419 }
7420
7437
7439 {
7440 foreach (TSource element in source)
7441 {
7442 foreach (TCollection item in collectionSelector(element))
7443 {
7444 yield return resultSelector(element, item);
7445 }
7446 }
7447 }
7448
7450 {
7451 return first.SequenceEqual(second, null);
7452 }
7453
7455 {
7456 if (first == null)
7457 {
7459 }
7460 if (second == null)
7461 {
7463 }
7465 {
7466 if (first is TSource[] array && second is TSource[] array2)
7467 {
7469 }
7470 if (collection.Count != collection2.Count)
7471 {
7472 return false;
7473 }
7475 {
7476 if (comparer == null)
7477 {
7479 }
7480 int count = collection.Count;
7481 for (int i = 0; i < count; i++)
7482 {
7483 if (!comparer.Equals(list[i], list2[i]))
7484 {
7485 return false;
7486 }
7487 }
7488 return true;
7489 }
7490 }
7491 using IEnumerator<TSource> enumerator = first.GetEnumerator();
7492 using IEnumerator<TSource> enumerator2 = second.GetEnumerator();
7493 if (comparer == null)
7494 {
7496 }
7497 while (enumerator.MoveNext())
7498 {
7499 if (!enumerator2.MoveNext() || !comparer.Equals(enumerator.Current, enumerator2.Current))
7500 {
7501 return false;
7502 }
7503 }
7504 return !enumerator2.MoveNext();
7505 }
7506
7507 public static TSource Single<TSource>(this IEnumerable<TSource> source)
7508 {
7509 bool found;
7510 TSource result = source.TryGetSingle(out found);
7511 if (!found)
7512 {
7514 }
7515 return result;
7516 }
7517
7519 {
7520 bool found;
7521 TSource result = source.TryGetSingle(predicate, out found);
7522 if (!found)
7523 {
7525 }
7526 return result;
7527 }
7528
7530 {
7531 bool found;
7532 return source.TryGetSingle(out found);
7533 }
7534
7536 {
7537 bool found;
7538 TSource result = source.TryGetSingle(out found);
7539 if (!found)
7540 {
7541 return defaultValue;
7542 }
7543 return result;
7544 }
7545
7547 {
7548 bool found;
7549 return source.TryGetSingle(predicate, out found);
7550 }
7551
7553 {
7554 bool found;
7555 TSource result = source.TryGetSingle(predicate, out found);
7556 if (!found)
7557 {
7558 return defaultValue;
7559 }
7560 return result;
7561 }
7562
7563 private static TSource TryGetSingle<TSource>(this IEnumerable<TSource> source, out bool found)
7564 {
7565 if (source == null)
7566 {
7568 }
7569 if (source is IList<TSource> { Count: var count } list)
7570 {
7571 switch (count)
7572 {
7573 case 0:
7574 found = false;
7575 return default(TSource);
7576 case 1:
7577 found = true;
7578 return list[0];
7579 }
7580 }
7581 else
7582 {
7583 using IEnumerator<TSource> enumerator = source.GetEnumerator();
7584 if (!enumerator.MoveNext())
7585 {
7586 found = false;
7587 return default(TSource);
7588 }
7589 TSource current = enumerator.Current;
7590 if (!enumerator.MoveNext())
7591 {
7592 found = true;
7593 return current;
7594 }
7595 }
7596 found = false;
7598 return default(TSource);
7599 }
7600
7602 {
7603 if (source == null)
7604 {
7606 }
7607 if (predicate == null)
7608 {
7610 }
7612 {
7613 while (enumerator.MoveNext())
7614 {
7615 TSource current = enumerator.Current;
7616 if (!predicate(current))
7617 {
7618 continue;
7619 }
7620 while (enumerator.MoveNext())
7621 {
7622 if (predicate(enumerator.Current))
7623 {
7625 }
7626 }
7627 found = true;
7628 return current;
7629 }
7630 }
7631 found = false;
7632 return default(TSource);
7633 }
7634
7636 {
7637 if (source == null)
7638 {
7640 }
7641 if (count <= 0)
7642 {
7644 {
7645 return source;
7646 }
7647 count = 0;
7648 }
7650 {
7651 return partition.Skip(count);
7652 }
7653 return SkipIterator(source, count);
7654 }
7655
7668
7670 {
7671 using IEnumerator<TSource> e = source.GetEnumerator();
7672 while (e.MoveNext())
7673 {
7674 TSource current = e.Current;
7675 if (!predicate(current))
7676 {
7677 yield return current;
7678 while (e.MoveNext())
7679 {
7680 yield return e.Current;
7681 }
7682 yield break;
7683 }
7684 }
7685 }
7686
7699
7701 {
7702 using IEnumerator<TSource> e = source.GetEnumerator();
7703 int num = -1;
7704 while (e.MoveNext())
7705 {
7706 num = checked(num + 1);
7707 TSource current = e.Current;
7708 if (!predicate(current, num))
7709 {
7710 yield return current;
7711 while (e.MoveNext())
7712 {
7713 yield return e.Current;
7714 }
7715 yield break;
7716 }
7717 }
7718 }
7719
7721 {
7722 if (source == null)
7723 {
7725 }
7726 if (count > 0)
7727 {
7729 }
7730 return source.Skip(0);
7731 }
7732
7733 public static int Sum(this IEnumerable<int> source)
7734 {
7735 if (source == null)
7736 {
7738 }
7739 int num = 0;
7740 foreach (int item in source)
7741 {
7742 num = checked(num + item);
7743 }
7744 return num;
7745 }
7746
7747 public static int? Sum(this IEnumerable<int?> source)
7748 {
7749 if (source == null)
7750 {
7752 }
7753 int num = 0;
7754 foreach (int? item in source)
7755 {
7756 if (item.HasValue)
7757 {
7758 num = checked(num + item.GetValueOrDefault());
7759 }
7760 }
7761 return num;
7762 }
7763
7764 public static long Sum(this IEnumerable<long> source)
7765 {
7766 if (source == null)
7767 {
7769 }
7770 long num = 0L;
7771 foreach (long item in source)
7772 {
7773 num = checked(num + item);
7774 }
7775 return num;
7776 }
7777
7778 public static long? Sum(this IEnumerable<long?> source)
7779 {
7780 if (source == null)
7781 {
7783 }
7784 long num = 0L;
7785 foreach (long? item in source)
7786 {
7787 if (item.HasValue)
7788 {
7789 num = checked(num + item.GetValueOrDefault());
7790 }
7791 }
7792 return num;
7793 }
7794
7795 public static float Sum(this IEnumerable<float> source)
7796 {
7797 if (source == null)
7798 {
7800 }
7801 double num = 0.0;
7802 foreach (float item in source)
7803 {
7804 num += (double)item;
7805 }
7806 return (float)num;
7807 }
7808
7809 public static float? Sum(this IEnumerable<float?> source)
7810 {
7811 if (source == null)
7812 {
7814 }
7815 double num = 0.0;
7816 foreach (float? item in source)
7817 {
7818 if (item.HasValue)
7819 {
7820 num += (double)item.GetValueOrDefault();
7821 }
7822 }
7823 return (float)num;
7824 }
7825
7826 public static double Sum(this IEnumerable<double> source)
7827 {
7828 if (source == null)
7829 {
7831 }
7832 double num = 0.0;
7833 foreach (double item in source)
7834 {
7835 num += item;
7836 }
7837 return num;
7838 }
7839
7840 public static double? Sum(this IEnumerable<double?> source)
7841 {
7842 if (source == null)
7843 {
7845 }
7846 double num = 0.0;
7847 foreach (double? item in source)
7848 {
7849 if (item.HasValue)
7850 {
7851 num += item.GetValueOrDefault();
7852 }
7853 }
7854 return num;
7855 }
7856
7857 public static decimal Sum(this IEnumerable<decimal> source)
7858 {
7859 if (source == null)
7860 {
7862 }
7863 decimal result = default(decimal);
7864 foreach (decimal item in source)
7865 {
7866 result += item;
7867 }
7868 return result;
7869 }
7870
7871 public static decimal? Sum(this IEnumerable<decimal?> source)
7872 {
7873 if (source == null)
7874 {
7876 }
7877 decimal value = default(decimal);
7878 foreach (decimal? item in source)
7879 {
7880 if (item.HasValue)
7881 {
7882 value += item.GetValueOrDefault();
7883 }
7884 }
7885 return value;
7886 }
7887
7889 {
7890 if (source == null)
7891 {
7893 }
7894 if (selector == null)
7895 {
7897 }
7898 int num = 0;
7899 foreach (TSource item in source)
7900 {
7901 num = checked(num + selector(item));
7902 }
7903 return num;
7904 }
7905
7907 {
7908 if (source == null)
7909 {
7911 }
7912 if (selector == null)
7913 {
7915 }
7916 int num = 0;
7917 foreach (TSource item in source)
7918 {
7919 int? num2 = selector(item);
7920 if (num2.HasValue)
7921 {
7922 num = checked(num + num2.GetValueOrDefault());
7923 }
7924 }
7925 return num;
7926 }
7927
7929 {
7930 if (selector == null)
7931 {
7933 }
7934 if (source == null)
7935 {
7937 }
7938 long num = 0L;
7939 foreach (TSource item in source)
7940 {
7941 num = checked(num + selector(item));
7942 }
7943 return num;
7944 }
7945
7947 {
7948 if (source == null)
7949 {
7951 }
7952 if (selector == null)
7953 {
7955 }
7956 long num = 0L;
7957 foreach (TSource item in source)
7958 {
7959 long? num2 = selector(item);
7960 if (num2.HasValue)
7961 {
7962 num = checked(num + num2.GetValueOrDefault());
7963 }
7964 }
7965 return num;
7966 }
7967
7969 {
7970 if (source == null)
7971 {
7973 }
7974 if (selector == null)
7975 {
7977 }
7978 double num = 0.0;
7979 foreach (TSource item in source)
7980 {
7981 num += (double)selector(item);
7982 }
7983 return (float)num;
7984 }
7985
7987 {
7988 if (source == null)
7989 {
7991 }
7992 if (selector == null)
7993 {
7995 }
7996 double num = 0.0;
7997 foreach (TSource item in source)
7998 {
7999 float? num2 = selector(item);
8000 if (num2.HasValue)
8001 {
8002 num += (double)num2.GetValueOrDefault();
8003 }
8004 }
8005 return (float)num;
8006 }
8007
8009 {
8010 if (source == null)
8011 {
8013 }
8014 if (selector == null)
8015 {
8017 }
8018 double num = 0.0;
8019 foreach (TSource item in source)
8020 {
8021 num += selector(item);
8022 }
8023 return num;
8024 }
8025
8027 {
8028 if (source == null)
8029 {
8031 }
8032 if (selector == null)
8033 {
8035 }
8036 double num = 0.0;
8037 foreach (TSource item in source)
8038 {
8039 double? num2 = selector(item);
8040 if (num2.HasValue)
8041 {
8042 num += num2.GetValueOrDefault();
8043 }
8044 }
8045 return num;
8046 }
8047
8049 {
8050 if (source == null)
8051 {
8053 }
8054 if (selector == null)
8055 {
8057 }
8058 decimal result = default(decimal);
8059 foreach (TSource item in source)
8060 {
8061 result += selector(item);
8062 }
8063 return result;
8064 }
8065
8067 {
8068 if (source == null)
8069 {
8071 }
8072 if (selector == null)
8073 {
8075 }
8076 decimal value = default(decimal);
8077 foreach (TSource item in source)
8078 {
8079 decimal? num = selector(item);
8080 if (num.HasValue)
8081 {
8082 value += num.GetValueOrDefault();
8083 }
8084 }
8085 return value;
8086 }
8087
8089 {
8090 if (source == null)
8091 {
8093 }
8094 if (count > 0)
8095 {
8096 return TakeIterator(source, count);
8097 }
8098 return Empty<TSource>();
8099 }
8100
8102 {
8103 if (source == null)
8104 {
8106 }
8107 Index start = range.Start;
8108 Index end = range.End;
8109 bool isFromEnd = start.IsFromEnd;
8110 bool isFromEnd2 = end.IsFromEnd;
8111 int value = start.Value;
8112 int value2 = end.Value;
8113 if (isFromEnd)
8114 {
8115 if (value == 0 || (isFromEnd2 && value2 >= value))
8116 {
8117 return Empty<TSource>();
8118 }
8119 }
8120 else if (!isFromEnd2)
8121 {
8122 if (value < value2)
8123 {
8125 }
8126 return Empty<TSource>();
8127 }
8129 }
8130
8132 {
8133 if (source.TryGetNonEnumeratedCount(out var count2))
8134 {
8137 if (startIndex >= endIndex)
8138 {
8139 yield break;
8140 }
8141 foreach (TSource item in TakeRangeIterator(source, startIndex, endIndex))
8142 {
8143 yield return item;
8144 }
8145 yield break;
8146 }
8148 {
8151 {
8152 if (!enumerator2.MoveNext())
8153 {
8154 yield break;
8155 }
8156 queue = new Queue<TSource>();
8157 queue.Enqueue(enumerator2.Current);
8158 count2 = 1;
8159 while (enumerator2.MoveNext())
8160 {
8161 if (count2 < startIndex)
8162 {
8163 queue.Enqueue(enumerator2.Current);
8164 count2++;
8165 continue;
8166 }
8167 do
8168 {
8169 queue.Dequeue();
8170 queue.Enqueue(enumerator2.Current);
8171 count2 = checked(count2 + 1);
8172 }
8173 while (enumerator2.MoveNext());
8174 break;
8175 }
8176 }
8180 {
8181 yield return queue.Dequeue();
8182 }
8183 yield break;
8184 }
8186 {
8187 for (count2 = 0; count2 < startIndex; count2++)
8188 {
8189 if (!enumerator.MoveNext())
8190 {
8191 break;
8192 }
8193 }
8194 if (count2 != startIndex)
8195 {
8196 yield break;
8197 }
8199 while (enumerator.MoveNext())
8200 {
8201 if (queue.Count == endIndex)
8202 {
8203 do
8204 {
8205 queue.Enqueue(enumerator.Current);
8206 yield return queue.Dequeue();
8207 }
8208 while (enumerator.MoveNext());
8209 break;
8210 }
8211 queue.Enqueue(enumerator.Current);
8212 }
8213 }
8214 static int CalculateEndIndex(bool isEndIndexFromEnd, int endIndex, int count)
8215 {
8217 }
8218 static int CalculateStartIndex(bool isStartIndexFromEnd, int startIndex, int count)
8219 {
8221 }
8222 }
8223
8236
8238 {
8239 foreach (TSource item in source)
8240 {
8241 if (!predicate(item))
8242 {
8243 break;
8244 }
8245 yield return item;
8246 }
8247 }
8248
8261
8263 {
8264 int index = -1;
8265 foreach (TSource item in source)
8266 {
8267 index = checked(index + 1);
8268 if (!predicate(item, index))
8269 {
8270 break;
8271 }
8272 yield return item;
8273 }
8274 }
8275
8277 {
8278 if (source == null)
8279 {
8281 }
8282 if (count > 0)
8283 {
8285 }
8286 return Empty<TSource>();
8287 }
8288
8289 public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
8290 {
8291 if (source == null)
8292 {
8294 }
8296 {
8298 }
8299 return iIListProvider.ToArray();
8300 }
8301
8303 {
8304 if (source == null)
8305 {
8307 }
8309 {
8310 return new List<TSource>(source);
8311 }
8312 return iIListProvider.ToList();
8313 }
8314
8319
8321 {
8322 if (source == null)
8323 {
8325 }
8326 if (keySelector == null)
8327 {
8329 }
8330 int num = 0;
8332 {
8333 num = collection.Count;
8334 if (num == 0)
8335 {
8337 }
8338 if (collection is TSource[] source2)
8339 {
8341 }
8343 {
8345 }
8346 }
8348 foreach (TSource item in source)
8349 {
8351 }
8352 return dictionary;
8353 }
8354
8356 {
8358 for (int i = 0; i < source.Length; i++)
8359 {
8360 dictionary.Add(keySelector(source[i]), source[i]);
8361 }
8362 return dictionary;
8363 }
8364
8374
8379
8381 {
8382 if (source == null)
8383 {
8385 }
8386 if (keySelector == null)
8387 {
8389 }
8390 if (elementSelector == null)
8391 {
8393 }
8394 int num = 0;
8396 {
8397 num = collection.Count;
8398 if (num == 0)
8399 {
8401 }
8402 if (collection is TSource[] source2)
8403 {
8405 }
8407 {
8409 }
8410 }
8412 foreach (TSource item in source)
8413 {
8415 }
8416 return dictionary;
8417 }
8418
8428
8438
8440 {
8441 return source.ToHashSet(null);
8442 }
8443
8452
8453 private static TSource[] HashSetToArray<TSource>(HashSet<TSource> set)
8454 {
8455 TSource[] array = new TSource[set.Count];
8456 set.CopyTo(array);
8457 return array;
8458 }
8459
8461 {
8462 List<TSource> list = new List<TSource>(set.Count);
8463 foreach (TSource item in set)
8464 {
8465 list.Add(item);
8466 }
8467 return list;
8468 }
8469
8471 {
8472 return first.Union(second, null);
8473 }
8474
8476 {
8477 if (first == null)
8478 {
8480 }
8481 if (second == null)
8482 {
8484 }
8485 if (!(first is UnionIterator<TSource> unionIterator) || !Utilities.AreEqualityComparersEqual<TSource>(comparer, unionIterator._comparer))
8486 {
8488 }
8489 return unionIterator.Union(second);
8490 }
8491
8496
8513
8515 {
8516 HashSet<TKey> set = new HashSet<TKey>(7, comparer);
8517 foreach (TSource item in first)
8518 {
8519 if (set.Add(keySelector(item)))
8520 {
8521 yield return item;
8522 }
8523 }
8524 foreach (TSource item2 in second)
8525 {
8526 if (set.Add(keySelector(item2)))
8527 {
8528 yield return item2;
8529 }
8530 }
8531 }
8532
8534 {
8535 if (source == null)
8536 {
8538 }
8539 if (predicate == null)
8540 {
8542 }
8544 {
8545 return iterator.Where(predicate);
8546 }
8547 if (source is TSource[] array)
8548 {
8549 if (array.Length != 0)
8550 {
8552 }
8553 return Empty<TSource>();
8554 }
8556 {
8558 }
8560 }
8561
8574
8576 {
8577 int index = -1;
8578 foreach (TSource item in source)
8579 {
8580 index = checked(index + 1);
8581 if (predicate(item, index))
8582 {
8583 yield return item;
8584 }
8585 }
8586 }
8587
8604
8606 {
8607 if (first == null)
8608 {
8610 }
8611 if (second == null)
8612 {
8614 }
8615 return ZipIterator(first, second);
8616 }
8617
8619 {
8620 if (first == null)
8621 {
8623 }
8624 if (second == null)
8625 {
8627 }
8628 if (third == null)
8629 {
8631 }
8632 return ZipIterator(first, second, third);
8633 }
8634
8636 {
8639 while (e1.MoveNext() && e2.MoveNext())
8640 {
8641 yield return (First: e1.Current, Second: e2.Current);
8642 }
8643 }
8644
8646 {
8649 while (e1.MoveNext() && e2.MoveNext())
8650 {
8651 yield return resultSelector(e1.Current, e2.Current);
8652 }
8653 }
8654
8656 {
8660 while (e1.MoveNext() && e2.MoveNext() && e3.MoveNext())
8661 {
8662 yield return (First: e1.Current, Second: e2.Current, Third: e3.Current);
8663 }
8664 }
8665}
static void Reverse(Array array)
Definition Array.cs:2207
int Length
Definition Array.cs:430
IEqualityComparer< TKey > _comparer
void CopyTo(KeyValuePair< TKey, TValue >[] array, int index)
void AddRange(IEnumerable< KeyValuePair< TKey, TValue > > collection)
void Add(TKey key, TValue value)
void ICollection< T >. Add(T item)
Definition HashSet.cs:225
static int CurrentManagedThreadId
override AppendPrependIterator< TSource > Prepend(TSource item)
AppendPrepend1Iterator(IEnumerable< TSource > source, TSource item, bool appending)
override int GetCount(bool onlyIfCheap)
override Iterator< TSource > Clone()
override AppendPrependIterator< TSource > Append(TSource item)
AppendPrependIterator(IEnumerable< TSource > source)
Definition Enumerable.cs:22
readonly IEnumerable< TSource > _source
Definition Enumerable.cs:12
AppendPrependIterator< TSource > Append(TSource item)
AppendPrependIterator< TSource > Prepend(TSource item)
override AppendPrependIterator< TSource > Prepend(TSource item)
override Iterator< TSource > Clone()
SingleLinkedNode< TSource > _node
AppendPrependN(IEnumerable< TSource > source, SingleLinkedNode< TSource > prepended, SingleLinkedNode< TSource > appended, int prependCount, int appendCount)
override int GetCount(bool onlyIfCheap)
readonly SingleLinkedNode< TSource > _prepended
readonly SingleLinkedNode< TSource > _appended
override AppendPrependIterator< TSource > Append(TSource item)
override List< TSource > ToList()
override Iterator< TSource > Clone()
override ConcatIterator< TSource > Concat(IEnumerable< TSource > next)
readonly IEnumerable< TSource > _first
readonly IEnumerable< TSource > _second
Concat2Iterator(IEnumerable< TSource > first, IEnumerable< TSource > second)
override IEnumerable< TSource > GetEnumerable(int index)
override int GetCount(bool onlyIfCheap)
IEnumerator< TSource > _enumerator
IEnumerable< TSource > GetEnumerable(int index)
ConcatIterator< TSource > Concat(IEnumerable< TSource > next)
ConcatNIterator(ConcatIterator< TSource > tail, IEnumerable< TSource > head, int headIndex, bool hasOnlyCollections)
override int GetCount(bool onlyIfCheap)
readonly IEnumerable< TSource > _head
readonly ConcatIterator< TSource > _tail
override Iterator< TSource > Clone()
override IEnumerable< TSource > GetEnumerable(int index)
ConcatNIterator< TSource > PreviousN
override ConcatIterator< TSource > Concat(IEnumerable< TSource > next)
readonly IEnumerable< TSource > _source
DefaultIfEmptyIterator(IEnumerable< TSource > source, TSource defaultValue)
override Iterator< TSource > Clone()
override Iterator< TSource > Clone()
readonly IEqualityComparer< TSource > _comparer
readonly IEnumerable< TSource > _source
DistinctIterator(IEnumerable< TSource > source, IEqualityComparer< TSource > comparer)
EnumerablePartition(IEnumerable< TSource > source, int minIndexInclusive, int maxIndexInclusive)
bool SkipBeforeFirst(IEnumerator< TSource > en)
override IEnumerable< TResult > Select< TResult >(Func< TSource, TResult > selector)
IPartition< TSource > Take(int count)
readonly IEnumerable< TSource > _source
static uint SkipAndCount(uint index, IEnumerator< TSource > en)
static bool SkipBefore(int index, IEnumerator< TSource > en)
static int SkipAndCount(int index, IEnumerator< TSource > en)
IPartition< TSource > Skip(int count)
override Iterator< TSource > Clone()
TSource TryGetElementAt(int index, out bool found)
IEnumerator< TSource > GetEnumerator()
virtual IEnumerable< TResult > Select< TResult >(Func< TSource, TResult > selector)
Iterator< TSource > Clone()
object IEnumerator. Current
virtual IEnumerable< TSource > Where(Func< TSource, bool > predicate)
ListPartition(IList< TSource > source, int minIndexInclusive, int maxIndexInclusive)
IPartition< TSource > Skip(int count)
TSource TryGetLast(out bool found)
IPartition< TSource > Take(int count)
TSource TryGetFirst(out bool found)
override IEnumerable< TResult > Select< TResult >(Func< TSource, TResult > selector)
override Iterator< TSource > Clone()
readonly IList< TSource > _source
TSource TryGetElementAt(int index, out bool found)
RangeIterator(int start, int count)
IPartition< int > Take(int count)
override IEnumerable< TResult > Select< TResult >(Func< int, TResult > selector)
int TryGetElementAt(int index, out bool found)
override Iterator< int > Clone()
IPartition< int > Skip(int count)
override IEnumerable< TResult2 > Select< TResult2 >(Func< TResult, TResult2 > selector)
TResult TryGetFirst(out bool found)
TResult TryGetElementAt(int index, out bool found)
RepeatIterator(TResult element, int count)
override Iterator< TResult > Clone()
IPartition< TResult > Take(int count)
TResult TryGetLast(out bool found)
IPartition< TResult > Skip(int count)
override Iterator< TSource > Clone()
ReverseIterator(IEnumerable< TSource > source)
readonly IEnumerable< TSource > _source
override IEnumerable< TResult2 > Select< TResult2 >(Func< TResult, TResult2 > selector)
TResult TryGetElementAt(int index, out bool found)
SelectArrayIterator(TSource[] source, Func< TSource, TResult > selector)
IPartition< TResult > Take(int count)
override Iterator< TResult > Clone()
readonly Func< TSource, TResult > _selector
IPartition< TResult > Skip(int count)
readonly IEnumerable< TSource > _source
readonly Func< TSource, TResult > _selector
SelectEnumerableIterator(IEnumerable< TSource > source, Func< TSource, TResult > selector)
override IEnumerable< TResult2 > Select< TResult2 >(Func< TResult, TResult2 > selector)
readonly Func< TSource, TResult > _selector
IPartition< TResult > Take(int count)
TResult TryGetElementAt(int index, out bool found)
override Iterator< TResult > Clone()
SelectIListIterator(IList< TSource > source, Func< TSource, TResult > selector)
override IEnumerable< TResult2 > Select< TResult2 >(Func< TResult, TResult2 > selector)
IPartition< TResult > Skip(int count)
SelectIPartitionIterator(IPartition< TSource > source, Func< TSource, TResult > selector)
IPartition< TResult > Take(int count)
IPartition< TResult > Skip(int count)
readonly IPartition< TSource > _source
override IEnumerable< TResult2 > Select< TResult2 >(Func< TResult, TResult2 > selector)
readonly Func< TSource, TResult > _selector
TResult TryGetElementAt(int index, out bool found)
TResult TryGetElementAt(int index, out bool found)
SelectListIterator(List< TSource > source, Func< TSource, TResult > selector)
override Iterator< TResult > Clone()
IPartition< TResult > Skip(int count)
override IEnumerable< TResult2 > Select< TResult2 >(Func< TResult, TResult2 > selector)
readonly Func< TSource, TResult > _selector
List< TSource >.Enumerator _enumerator
IPartition< TResult > Take(int count)
override IEnumerable< TResult2 > Select< TResult2 >(Func< TResult, TResult2 > selector)
SelectListPartitionIterator(IList< TSource > source, Func< TSource, TResult > selector, int minIndexInclusive, int maxIndexInclusive)
TResult TryGetElementAt(int index, out bool found)
readonly Func< TSource, TResult > _selector
SelectManySingleSelectorIterator(IEnumerable< TSource > source, Func< TSource, IEnumerable< TResult > > selector)
readonly Func< TSource, IEnumerable< TResult > > _selector
IPartition< TResult > Skip(int count)
IPartition< TResult > Take(int count)
SelectRangeIterator(int start, int end, Func< int, TResult > selector)
readonly Func< int, TResult > _selector
override IEnumerable< TResult2 > Select< TResult2 >(Func< TResult, TResult2 > selector)
override Iterator< TResult > Clone()
TResult TryGetElementAt(int index, out bool found)
override IEnumerable< TSource > GetEnumerable(int index)
override UnionIterator< TSource > Union(IEnumerable< TSource > next)
UnionIterator2(IEnumerable< TSource > first, IEnumerable< TSource > second, IEqualityComparer< TSource > comparer)
readonly IEnumerable< TSource > _first
readonly IEnumerable< TSource > _second
override Iterator< TSource > Clone()
readonly SingleLinkedNode< IEnumerable< TSource > > _sources
override IEnumerable< TSource > GetEnumerable(int index)
override Iterator< TSource > Clone()
override UnionIterator< TSource > Union(IEnumerable< TSource > next)
UnionIteratorN(SingleLinkedNode< IEnumerable< TSource > > sources, int headIndex, IEqualityComparer< TSource > comparer)
readonly IEqualityComparer< TSource > _comparer
UnionIterator(IEqualityComparer< TSource > comparer)
void SetEnumerator(IEnumerator< TSource > enumerator)
IEnumerable< TSource > GetEnumerable(int index)
IEnumerator< TSource > _enumerator
UnionIterator< TSource > Union(IEnumerable< TSource > next)
override IEnumerable< TSource > Where(Func< TSource, bool > predicate)
readonly Func< TSource, bool > _predicate
override IEnumerable< TResult > Select< TResult >(Func< TSource, TResult > selector)
override Iterator< TSource > Clone()
WhereArrayIterator(TSource[] source, Func< TSource, bool > predicate)
override Iterator< TSource > Clone()
readonly IEnumerable< TSource > _source
readonly Func< TSource, bool > _predicate
WhereEnumerableIterator(IEnumerable< TSource > source, Func< TSource, bool > predicate)
override IEnumerable< TResult > Select< TResult >(Func< TSource, TResult > selector)
override IEnumerable< TSource > Where(Func< TSource, bool > predicate)
override IEnumerable< TSource > Where(Func< TSource, bool > predicate)
WhereListIterator(List< TSource > source, Func< TSource, bool > predicate)
override Iterator< TSource > Clone()
override IEnumerable< TResult > Select< TResult >(Func< TSource, TResult > selector)
readonly Func< TSource, bool > _predicate
List< TSource >.Enumerator _enumerator
readonly Func< TSource, bool > _predicate
override IEnumerable< TResult2 > Select< TResult2 >(Func< TResult, TResult2 > selector)
readonly Func< TSource, TResult > _selector
WhereSelectArrayIterator(TSource[] source, Func< TSource, bool > predicate, Func< TSource, TResult > selector)
override IEnumerable< TResult2 > Select< TResult2 >(Func< TResult, TResult2 > selector)
WhereSelectEnumerableIterator(IEnumerable< TSource > source, Func< TSource, bool > predicate, Func< TSource, TResult > selector)
readonly Func< TSource, TResult > _selector
readonly Func< TSource, TResult > _selector
override IEnumerable< TResult2 > Select< TResult2 >(Func< TResult, TResult2 > selector)
WhereSelectListIterator(List< TSource > source, Func< TSource, bool > predicate, Func< TSource, TResult > selector)
readonly Func< TSource, bool > _predicate
override Iterator< TResult > Clone()
static IEnumerable< TResult > GroupJoinIterator< TOuter, TInner, TKey, TResult >(IEnumerable< TOuter > outer, IEnumerable< TInner > inner, Func< TOuter, TKey > outerKeySelector, Func< TInner, TKey > innerKeySelector, Func< TOuter, IEnumerable< TInner >, TResult > resultSelector, IEqualityComparer< TKey > comparer)
static int Max(this IEnumerable< int > source)
static IEnumerable< TResult > JoinIterator< TOuter, TInner, TKey, TResult >(IEnumerable< TOuter > outer, IEnumerable< TInner > inner, Func< TOuter, TKey > outerKeySelector, Func< TInner, TKey > innerKeySelector, Func< TOuter, TInner, TResult > resultSelector, IEqualityComparer< TKey > comparer)
static long Sum(this IEnumerable< long > source)
static IEnumerable< TResult > ZipIterator< TFirst, TSecond, TResult >(IEnumerable< TFirst > first, IEnumerable< TSecond > second, Func< TFirst, TSecond, TResult > resultSelector)
static float Min(this IEnumerable< float > source)
static IEnumerable< TSource > Append< TSource >(this IEnumerable< TSource > source, TSource element)
static Dictionary< TKey, TElement > ToDictionary< TSource, TKey, TElement >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector, Func< TSource, TElement > elementSelector)
static ? TResult Min< TSource, TResult >(this IEnumerable< TSource > source, Func< TSource, TResult > selector)
static IEnumerable< TResult > GroupJoin< TOuter, TInner, TKey, TResult >(this IEnumerable< TOuter > outer, IEnumerable< TInner > inner, Func< TOuter, TKey > outerKeySelector, Func< TInner, TKey > innerKeySelector, Func< TOuter, IEnumerable< TInner >, TResult > resultSelector)
static ? float Sum(this IEnumerable< float?> source)
static TResult Aggregate< TSource, TAccumulate, TResult >(this IEnumerable< TSource > source, TAccumulate seed, Func< TAccumulate, TSource, TAccumulate > func, Func< TAccumulate, TResult > resultSelector)
static bool Contains< TSource >(this IEnumerable< TSource > source, TSource value)
static ? TSource MinBy< TSource, TKey >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector)
static IEnumerable< TSource[]> Chunk< TSource >(this IEnumerable< TSource > source, int size)
static IEnumerable< TSource > Skip< TSource >(this IEnumerable< TSource > source, int count)
static ? double Min(this IEnumerable< double?> source)
static IEnumerable< TSource > Concat< TSource >(this IEnumerable< TSource > first, IEnumerable< TSource > second)
static ILookup< TKey, TElement > ToLookup< TSource, TKey, TElement >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector, Func< TSource, TElement > elementSelector)
static TSource Single< TSource >(this IEnumerable< TSource > source)
static ? long Min(this IEnumerable< long?> source)
static ? int Min(this IEnumerable< int?> source)
static bool Any< TSource >(this IEnumerable< TSource > source)
static IEnumerable< TSource > IntersectByIterator< TSource, TKey >(IEnumerable< TSource > first, IEnumerable< TKey > second, Func< TSource, TKey > keySelector, IEqualityComparer< TKey > comparer)
static IEnumerable< IGrouping< TKey, TSource > > GroupBy< TSource, TKey >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector)
static int Sum< TSource >(this IEnumerable< TSource > source, Func< TSource, int > selector)
static void CreateSelectIPartitionIterator< TResult, TSource >(Func< TSource, TResult > selector, IPartition< TSource > partition, [NotNull] ref IEnumerable< TResult > result)
static double Average< TSource >(this IEnumerable< TSource > source, Func< TSource, int > selector)
static float Sum(this IEnumerable< float > source)
static IEnumerable< TSource > TakeRangeIterator< TSource >(IEnumerable< TSource > source, int startIndex, int endIndex)
static IEnumerable< TSource > IntersectIterator< TSource >(IEnumerable< TSource > first, IEnumerable< TSource > second, IEqualityComparer< TSource > comparer)
static ? TResult Max< TSource, TResult >(this IEnumerable< TSource > source, Func< TSource, TResult > selector)
static IEnumerable< TResult > GroupBy< TSource, TKey, TElement, TResult >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector, Func< TSource, TElement > elementSelector, Func< TKey, IEnumerable< TElement >, TResult > resultSelector)
static List< TSource > ToList< TSource >(this IEnumerable< TSource > source)
static double Average(this IEnumerable< long > source)
static ? double Average(this IEnumerable< double?> source)
static IEnumerable< TSource > TakeWhile< TSource >(this IEnumerable< TSource > source, Func< TSource, bool > predicate)
static IEnumerable< TSource > IntersectBy< TSource, TKey >(this IEnumerable< TSource > first, IEnumerable< TKey > second, Func< TSource, TKey > keySelector)
static IEnumerable< TSource > UnionByIterator< TSource, TKey >(IEnumerable< TSource > first, IEnumerable< TSource > second, Func< TSource, TKey > keySelector, IEqualityComparer< TKey > comparer)
static double Average(this IEnumerable< int > source)
static ? float Average(this IEnumerable< float?> source)
static Dictionary< TKey, TSource > ToDictionary< TSource, TKey >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector)
static ? long Max(this IEnumerable< long?> source)
static IEnumerable< TSource > Take< TSource >(this IEnumerable< TSource > source, int count)
static TSource ElementAt< TSource >(this IEnumerable< TSource > source, int index)
static ? decimal Average(this IEnumerable< decimal?> source)
static IEnumerable< TSource > TakeLast< TSource >(this IEnumerable< TSource > source, int count)
static ? long Sum(this IEnumerable< long?> source)
static TSource Aggregate< TSource >(this IEnumerable< TSource > source, Func< TSource, TSource, TSource > func)
static IEnumerable< TResult > SelectManyIterator< TSource, TCollection, TResult >(IEnumerable< TSource > source, Func< TSource, int, IEnumerable< TCollection > > collectionSelector, Func< TSource, TCollection, TResult > resultSelector)
static ? float Max(this IEnumerable< float?> source)
static IEnumerable< TResult > SelectIterator< TSource, TResult >(IEnumerable< TSource > source, Func< TSource, int, TResult > selector)
static long LongCount< TSource >(this IEnumerable< TSource > source)
static IEnumerable< TSource > Intersect< TSource >(this IEnumerable< TSource > first, IEnumerable< TSource > second)
static double Sum(this IEnumerable< double > source)
static IEnumerable< TSource > TakeIterator< TSource >(IEnumerable< TSource > source, int count)
static IEnumerable< TSource?> DefaultIfEmpty< TSource >(this IEnumerable< TSource > source)
static ? double Average(this IEnumerable< long?> source)
static IEnumerable< TResult > Zip< TFirst, TSecond, TResult >(this IEnumerable< TFirst > first, IEnumerable< TSecond > second, Func< TFirst, TSecond, TResult > resultSelector)
static TSource TryGetFirst< TSource >(this IEnumerable< TSource > source, out bool found)
static IEnumerable< int > Range(int start, int count)
static TSource Last< TSource >(this IEnumerable< TSource > source)
static IEnumerable< TSource > ExceptIterator< TSource >(IEnumerable< TSource > first, IEnumerable< TSource > second, IEqualityComparer< TSource > comparer)
static IEnumerable< TResult > SelectMany< TSource, TCollection, TResult >(this IEnumerable< TSource > source, Func< TSource, int, IEnumerable< TCollection > > collectionSelector, Func< TSource, TCollection, TResult > resultSelector)
static float Average(this IEnumerable< float > source)
static IEnumerable< TResult > GroupBy< TSource, TKey, TResult >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector, Func< TKey, IEnumerable< TSource >, TResult > resultSelector)
static IEnumerable< TResult > SelectMany< TSource, TResult >(this IEnumerable< TSource > source, Func< TSource, IEnumerable< TResult > > selector)
static TSource TryGetSingle< TSource >(this IEnumerable< TSource > source, out bool found)
static IEnumerable< TResult > Empty< TResult >()
static IEnumerable< TSource > SkipLast< TSource >(this IEnumerable< TSource > source, int count)
static decimal Average(this IEnumerable< decimal > source)
static bool TryGetElement< TSource >(IEnumerable< TSource > source, int index, [MaybeNullWhen(false)] out TSource element)
static ? float Min(this IEnumerable< float?> source)
static TSource[] ToArray< TSource >(this IEnumerable< TSource > source)
static ? int Max(this IEnumerable< int?> source)
static IEnumerable< TSource > AsEnumerable< TSource >(this IEnumerable< TSource > source)
static ? double Sum(this IEnumerable< double?> source)
static IEnumerable< TSource > Except< TSource >(this IEnumerable< TSource > first, IEnumerable< TSource > second)
static ? double Average(this IEnumerable< int?> source)
static bool TryGetElementFromEnd< TSource >(IEnumerable< TSource > source, int indexFromEnd, [MaybeNullWhen(false)] out TSource element)
static IEnumerable< TSource > TakeWhileIterator< TSource >(IEnumerable< TSource > source, Func< TSource, bool > predicate)
static IEnumerable< TResult > SelectManyIterator< TSource, TResult >(IEnumerable< TSource > source, Func< TSource, int, IEnumerable< TResult > > selector)
static List< TSource > HashSetToList< TSource >(HashSet< TSource > set)
static bool All< TSource >(this IEnumerable< TSource > source, Func< TSource, bool > predicate)
static decimal Max(this IEnumerable< decimal > source)
static IEnumerable< TSource[]> ChunkIterator< TSource >(IEnumerable< TSource > source, int size)
static ILookup< TKey, TSource > ToLookup< TSource, TKey >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector)
static ? TSource FirstOrDefault< TSource >(this IEnumerable< TSource > source)
static IEnumerable< TResult > Cast< TResult >(this IEnumerable source)
static ? int Sum(this IEnumerable< int?> source)
static ? TSource SingleOrDefault< TSource >(this IEnumerable< TSource > source)
static IEnumerable< TResult > Repeat< TResult >(TResult element, int count)
static double Average(this IEnumerable< double > source)
static TAccumulate Aggregate< TSource, TAccumulate >(this IEnumerable< TSource > source, TAccumulate seed, Func< TAccumulate, TSource, TAccumulate > func)
static IEnumerable< TSource > Reverse< TSource >(this IEnumerable< TSource > source)
static IEnumerable< TResult > OfTypeIterator< TResult >(IEnumerable source)
static decimal Sum(this IEnumerable< decimal > source)
static IEnumerable< TSource > SkipIterator< TSource >(IEnumerable< TSource > source, int count)
static double Min(this IEnumerable< double > source)
static IEnumerable< TResult > Select< TSource, TResult >(this IEnumerable< TSource > source, Func< TSource, TResult > selector)
static IEnumerable< TSource > Union< TSource >(this IEnumerable< TSource > first, IEnumerable< TSource > second)
static IEnumerable< TSource > Where< TSource >(this IEnumerable< TSource > source, Func< TSource, bool > predicate)
static ? TSource MaxBy< TSource, TKey >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector)
static long Max(this IEnumerable< long > source)
static ? double Max(this IEnumerable< double?> source)
static HashSet< TSource > ToHashSet< TSource >(this IEnumerable< TSource > source)
static IEnumerable< TSource > TakeRangeFromEndIterator< TSource >(IEnumerable< TSource > source, bool isStartIndexFromEnd, int startIndex, bool isEndIndexFromEnd, int endIndex)
static IEnumerable< TSource > DistinctBy< TSource, TKey >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector)
static long Min(this IEnumerable< long > source)
static bool SequenceEqual< TSource >(this IEnumerable< TSource > first, IEnumerable< TSource > second)
static TSource TryGetLast< TSource >(this IEnumerable< TSource > source, out bool found)
static IOrderedEnumerable< TSource > OrderByDescending< TSource, TKey >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector)
static ? TSource Min< TSource >(this IEnumerable< TSource > source)
static TSource First< TSource >(this IEnumerable< TSource > source)
static IEnumerable< TResult > CastIterator< TResult >(IEnumerable source)
static ? decimal Min(this IEnumerable< decimal?> source)
static IEnumerable< TSource > Prepend< TSource >(this IEnumerable< TSource > source, TSource element)
static int Count< TSource >(this IEnumerable< TSource > source)
static IEnumerable< TSource > DistinctByIterator< TSource, TKey >(IEnumerable< TSource > source, Func< TSource, TKey > keySelector, IEqualityComparer< TKey > comparer)
static int Min(this IEnumerable< int > source)
static TSource[] HashSetToArray< TSource >(HashSet< TSource > set)
static IEnumerable< TSource > SkipWhileIterator< TSource >(IEnumerable< TSource > source, Func< TSource, bool > predicate)
static int Sum(this IEnumerable< int > source)
static IEnumerable< TSource > ExceptBy< TSource, TKey >(this IEnumerable< TSource > first, IEnumerable< TKey > second, Func< TSource, TKey > keySelector)
static ? TSource ElementAtOrDefault< TSource >(this IEnumerable< TSource > source, int index)
static double Max(this IEnumerable< double > source)
static IEnumerable< TResult > Join< TOuter, TInner, TKey, TResult >(this IEnumerable< TOuter > outer, IEnumerable< TInner > inner, Func< TOuter, TKey > outerKeySelector, Func< TInner, TKey > innerKeySelector, Func< TOuter, TInner, TResult > resultSelector)
static ? decimal Max(this IEnumerable< decimal?> source)
static IEnumerable< TSource > WhereIterator< TSource >(IEnumerable< TSource > source, Func< TSource, int, bool > predicate)
static IEnumerable< TSource > Distinct< TSource >(this IEnumerable< TSource > source)
static IOrderedEnumerable< TSource > ThenBy< TSource, TKey >(this IOrderedEnumerable< TSource > source, Func< TSource, TKey > keySelector)
static IEnumerable< TSource > SkipWhile< TSource >(this IEnumerable< TSource > source, Func< TSource, bool > predicate)
static ? decimal Sum(this IEnumerable< decimal?> source)
static IOrderedEnumerable< TSource > ThenByDescending< TSource, TKey >(this IOrderedEnumerable< TSource > source, Func< TSource, TKey > keySelector)
static float Max(this IEnumerable< float > source)
static IEnumerable< TSource > ExceptByIterator< TSource, TKey >(IEnumerable< TSource > first, IEnumerable< TKey > second, Func< TSource, TKey > keySelector, IEqualityComparer< TKey > comparer)
static IEnumerable< IGrouping< TKey, TElement > > GroupBy< TSource, TKey, TElement >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector, Func< TSource, TElement > elementSelector)
static decimal Min(this IEnumerable< decimal > source)
static IOrderedEnumerable< TSource > OrderBy< TSource, TKey >(this IEnumerable< TSource > source, Func< TSource, TKey > keySelector)
static IEnumerable< TSource > UnionBy< TSource, TKey >(this IEnumerable< TSource > first, IEnumerable< TSource > second, Func< TSource, TKey > keySelector)
static ? TSource Max< TSource >(this IEnumerable< TSource > source)
static bool TryGetNonEnumeratedCount< TSource >(this IEnumerable< TSource > source, out int count)
static IEnumerable< TResult > OfType< TResult >(this IEnumerable source)
static ? TSource LastOrDefault< TSource >(this IEnumerable< TSource > source)
SingleLinkedNode< TSource > Add(TSource item)
SingleLinkedNode< TSource > GetNode(int index)
static void ThrowNoElementsException()
static void ThrowMoreThanOneElementException()
static void ThrowArgumentOutOfRangeException(ExceptionArgument argument)
static void ThrowMoreThanOneMatchException()
static void ThrowArgumentNullException(ExceptionArgument argument)
Definition ThrowHelper.cs:8
static void ThrowNotSupportedException()
static void ThrowNoMatchException()
static byte Min(byte val1, byte val2)
Definition Math.cs:912
static byte Max(byte val1, byte val2)
Definition Math.cs:738
new IEnumerator< T > GetEnumerator()
IPartition< TElement > Skip(int count)
IPartition< TElement > Take(int count)
TElement TryGetElementAt(int index, out bool found)
TElement TryGetLast(out bool found)
TElement TryGetFirst(out bool found)
int Value
Definition Index.cs:15
bool IsFromEnd
Definition Index.cs:26