1 | #region License Information
|
---|
2 | /* HeuristicLab
|
---|
3 | * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
|
---|
4 | *
|
---|
5 | * This file is part of HeuristicLab.
|
---|
6 | *
|
---|
7 | * HeuristicLab is free software: you can redistribute it and/or modify
|
---|
8 | * it under the terms of the GNU General Public License as published by
|
---|
9 | * the Free Software Foundation, either version 3 of the License, or
|
---|
10 | * (at your option) any later version.
|
---|
11 | *
|
---|
12 | * HeuristicLab is distributed in the hope that it will be useful,
|
---|
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
15 | * GNU General Public License for more details.
|
---|
16 | *
|
---|
17 | * You should have received a copy of the GNU General Public License
|
---|
18 | * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
|
---|
19 | */
|
---|
20 | #endregion
|
---|
21 |
|
---|
22 | using System;
|
---|
23 | using System.Collections.Generic;
|
---|
24 |
|
---|
25 | namespace HeuristicLab.BioBoost.Utils {
|
---|
26 | public static class EnumerableExtensions {
|
---|
27 | public static IEnumerable<Tuple<T1, T2>> Zip<T1, T2>(IEnumerable<T1> e1, IEnumerable<T2> e2) {
|
---|
28 | var it1 = e1.GetEnumerator();
|
---|
29 | var it2 = e2.GetEnumerator();
|
---|
30 | while (it1.MoveNext() && it2.MoveNext()) {
|
---|
31 | yield return new Tuple<T1, T2>(it1.Current, it2.Current);
|
---|
32 | }
|
---|
33 | }
|
---|
34 | public static IEnumerable<Tuple<T1, T2, T3>> Zip<T1, T2, T3>(IEnumerable<T1> e1, IEnumerable<T2> e2, IEnumerable<T3> e3) {
|
---|
35 | var it1 = e1.GetEnumerator();
|
---|
36 | var it2 = e2.GetEnumerator();
|
---|
37 | var it3 = e3.GetEnumerator();
|
---|
38 | while (it1.MoveNext() && it2.MoveNext() && it3.MoveNext()) {
|
---|
39 | yield return new Tuple<T1, T2, T3>(it1.Current, it2.Current, it3.Current);
|
---|
40 | }
|
---|
41 | if (it1.MoveNext() || it2.MoveNext() || it3.MoveNext())
|
---|
42 | throw new InvalidOperationException("Iterators have different lengths");
|
---|
43 | }
|
---|
44 | public static IEnumerable<Tuple<T1, T2, T3, T4>> Zip<T1, T2, T3, T4>(IEnumerable<T1> e1, IEnumerable<T2> e2, IEnumerable<T3> e3, IEnumerable<T4> e4) {
|
---|
45 | var it1 = e1.GetEnumerator();
|
---|
46 | var it2 = e2.GetEnumerator();
|
---|
47 | var it3 = e3.GetEnumerator();
|
---|
48 | var it4 = e4.GetEnumerator();
|
---|
49 | while (it1.MoveNext() && it2.MoveNext() && it3.MoveNext() && it4.MoveNext()) {
|
---|
50 | yield return new Tuple<T1, T2, T3, T4>(it1.Current, it2.Current, it3.Current, it4.Current);
|
---|
51 | }
|
---|
52 | if (it1.MoveNext() || it2.MoveNext() || it3.MoveNext() || it4.MoveNext())
|
---|
53 | throw new InvalidOperationException("Iterators have different lengths");
|
---|
54 | }
|
---|
55 | public static IEnumerable<Tuple<T1, T2, T3, T4, T5>> Zip<T1, T2, T3, T4, T5>(IEnumerable<T1> e1, IEnumerable<T2> e2, IEnumerable<T3> e3, IEnumerable<T4> e4, IEnumerable<T5> e5) {
|
---|
56 | var it1 = e1.GetEnumerator();
|
---|
57 | var it2 = e2.GetEnumerator();
|
---|
58 | var it3 = e3.GetEnumerator();
|
---|
59 | var it4 = e4.GetEnumerator();
|
---|
60 | var it5 = e5.GetEnumerator();
|
---|
61 | while (it1.MoveNext() && it2.MoveNext() && it3.MoveNext() && it4.MoveNext() && it5.MoveNext()) {
|
---|
62 | yield return new Tuple<T1, T2, T3, T4, T5>(it1.Current, it2.Current, it3.Current, it4.Current, it5.Current);
|
---|
63 | }
|
---|
64 | if (it1.MoveNext() || it2.MoveNext() || it3.MoveNext() || it4.MoveNext() || it5.MoveNext())
|
---|
65 | throw new InvalidOperationException("Iterators have different lengths");
|
---|
66 | }
|
---|
67 | public static IEnumerable<Tuple<T1, T2, T3, T4, T5, T6>> Zip<T1, T2, T3, T4, T5, T6>(IEnumerable<T1> e1, IEnumerable<T2> e2, IEnumerable<T3> e3, IEnumerable<T4> e4, IEnumerable<T5> e5, IEnumerable<T6> e6) {
|
---|
68 | var it1 = e1.GetEnumerator();
|
---|
69 | var it2 = e2.GetEnumerator();
|
---|
70 | var it3 = e3.GetEnumerator();
|
---|
71 | var it4 = e4.GetEnumerator();
|
---|
72 | var it5 = e5.GetEnumerator();
|
---|
73 | var it6 = e6.GetEnumerator();
|
---|
74 | while (it1.MoveNext() && it2.MoveNext() && it3.MoveNext() && it4.MoveNext() && it5.MoveNext() && it6.MoveNext()) {
|
---|
75 | yield return new Tuple<T1, T2, T3, T4, T5, T6>(it1.Current, it2.Current, it3.Current, it4.Current, it5.Current, it6.Current);
|
---|
76 | }
|
---|
77 | if (it1.MoveNext() || it2.MoveNext() || it3.MoveNext() || it4.MoveNext() || it5.MoveNext() || it6.MoveNext())
|
---|
78 | throw new InvalidOperationException("Iterators have different lengths");
|
---|
79 | }
|
---|
80 | public static IEnumerable<Tuple<T1, T2, T3, T4, T5, T6, T7>> Zip<T1, T2, T3, T4, T5, T6, T7>(IEnumerable<T1> e1, IEnumerable<T2> e2, IEnumerable<T3> e3, IEnumerable<T4> e4, IEnumerable<T5> e5, IEnumerable<T6> e6, IEnumerable<T7> e7) {
|
---|
81 | var it1 = e1.GetEnumerator();
|
---|
82 | var it2 = e2.GetEnumerator();
|
---|
83 | var it3 = e3.GetEnumerator();
|
---|
84 | var it4 = e4.GetEnumerator();
|
---|
85 | var it5 = e5.GetEnumerator();
|
---|
86 | var it6 = e6.GetEnumerator();
|
---|
87 | var it7 = e7.GetEnumerator();
|
---|
88 | while (it1.MoveNext() && it2.MoveNext() && it3.MoveNext() && it4.MoveNext() && it5.MoveNext() && it6.MoveNext() && it7.MoveNext()) {
|
---|
89 | yield return new Tuple<T1, T2, T3, T4, T5, T6, T7>(it1.Current, it2.Current, it3.Current, it4.Current, it5.Current, it6.Current, it7.Current);
|
---|
90 | }
|
---|
91 | if (it1.MoveNext() || it2.MoveNext() || it3.MoveNext() || it4.MoveNext() || it5.MoveNext() || it6.MoveNext() || it7.MoveNext())
|
---|
92 | throw new InvalidOperationException("Iterators have different lengths");
|
---|
93 | }
|
---|
94 | public static IEnumerable<Tuple<T1, T2, T3, T4, T5, T6, T7, T8>> Zip<T1, T2, T3, T4, T5, T6, T7, T8>(IEnumerable<T1> e1, IEnumerable<T2> e2, IEnumerable<T3> e3, IEnumerable<T4> e4, IEnumerable<T5> e5, IEnumerable<T6> e6, IEnumerable<T7> e7, IEnumerable<T8> e8) {
|
---|
95 | var it1 = e1.GetEnumerator();
|
---|
96 | var it2 = e2.GetEnumerator();
|
---|
97 | var it3 = e3.GetEnumerator();
|
---|
98 | var it4 = e4.GetEnumerator();
|
---|
99 | var it5 = e5.GetEnumerator();
|
---|
100 | var it6 = e6.GetEnumerator();
|
---|
101 | var it7 = e7.GetEnumerator();
|
---|
102 | var it8 = e8.GetEnumerator();
|
---|
103 | while (it1.MoveNext() && it2.MoveNext() && it3.MoveNext() && it4.MoveNext() && it5.MoveNext() && it6.MoveNext() && it7.MoveNext() && it8.MoveNext()) {
|
---|
104 | yield return new Tuple<T1, T2, T3, T4, T5, T6, T7, T8>(it1.Current, it2.Current, it3.Current, it4.Current, it5.Current, it6.Current, it7.Current, it8.Current);
|
---|
105 | }
|
---|
106 | if (it1.MoveNext() || it2.MoveNext() || it3.MoveNext() || it4.MoveNext() || it5.MoveNext() || it6.MoveNext() || it7.MoveNext() || it8.MoveNext())
|
---|
107 | throw new InvalidOperationException("Iterators have different lengths");
|
---|
108 | }
|
---|
109 | }
|
---|
110 | }
|
---|