From 43c8a6a82e8c8bc5bae2925a4a90cbc5ba4a4117 Mon Sep 17 00:00:00 2001
From: Michael Krisper <michael.krisper@tugraz.at>
Date: Fri, 20 Aug 2021 14:30:17 +0200
Subject: [PATCH] added extension methods for zipping 4 enumerations

---
 .../Utils/EnumerableExtensionMethods.cs       | 21 +++++++++++++++++--
 .../Utils/DataTableExtensionMethods.cs        | 16 +++++++-------
 2 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/VectoCommon/VectoCommon/Utils/EnumerableExtensionMethods.cs b/VectoCommon/VectoCommon/Utils/EnumerableExtensionMethods.cs
index 4a57e53b14..5db90c2835 100644
--- a/VectoCommon/VectoCommon/Utils/EnumerableExtensionMethods.cs
+++ b/VectoCommon/VectoCommon/Utils/EnumerableExtensionMethods.cs
@@ -46,7 +46,7 @@ namespace TUGraz.VectoCommon.Utils
 		{
 			if (start < 0) start = source.Length + start;
 			if (end < 0) end = source.Length + end;
-			var dest = new T[end-start];
+			var dest = new T[end - start];
 			Array.ConstrainedCopy(source, start, dest, 0, end - start);
 			return dest;
 		}
@@ -137,7 +137,24 @@ namespace TUGraz.VectoCommon.Utils
 			}
 		}
 
-
+		/// <summary>
+		/// Zips all elements of two enumerable together. If the enumerables dont have the same length an exception is thrown.
+		/// </summary>
+		/// <exception cref="System.InvalidOperationException">Enumeration already finished. Thrown if the enumerables dont have the same length.</exception>
+		public static IEnumerable<(T1 Item1, T2 Item2, T3 Item3, T4 Item4)> Zip<T1, T2, T3, T4>(this IEnumerable<T1> item1, IEnumerable<T2> item2, IEnumerable<T3> item3, IEnumerable<T4> item4)
+		{
+			using (var first = item1.GetEnumerator()) {
+				using (var second = item2.GetEnumerator()) {
+					using (var third = item3.GetEnumerator()) {
+						using (var fourth = item4.GetEnumerator()) {
+							while (first.MoveNext() | second.MoveNext() | third.MoveNext() | fourth.MoveNext()) {
+								yield return (first.Current, second.Current, third.Current, fourth.Current);
+							}
+						}
+					}
+				}
+			}
+		}
 
 		/// <summary>
 		/// Sums up the values of selector.
diff --git a/VectoCore/VectoCore/Utils/DataTableExtensionMethods.cs b/VectoCore/VectoCore/Utils/DataTableExtensionMethods.cs
index 6add00ce46..32580a6abc 100644
--- a/VectoCore/VectoCore/Utils/DataTableExtensionMethods.cs
+++ b/VectoCore/VectoCore/Utils/DataTableExtensionMethods.cs
@@ -52,12 +52,6 @@ namespace TUGraz.VectoCore.Utils
 			return defaultValue;
 		}
 
-		public static IEnumerable<TResult> SelectData<TResult>(this DataTable self, Func<DataRow,TResult> selector) => 
-			self.Rows.Cast<DataRow>().Select(selector);
-
-		public static IEnumerable<TResult> SelectData<TResult>(this DataTable self, Func<DataRow, int, TResult> selector) => 
-			self.Rows.Cast<DataRow>().Select(selector);
-
 		public static IEnumerable<DataRow> Where(this DataTable self, Func<DataRow, bool> predicate) => 
 			self.Rows.Cast<DataRow>().Where(predicate);
 
@@ -124,6 +118,14 @@ namespace TUGraz.VectoCore.Utils
 				: row.Field<string>(row.Table.Columns[columnName]).ToBoolean();
 
 		public static IEnumerable<T> Values<T>(this DataColumn column) => 
-			column.Table.AsEnumerable().Select(r => r.Field<T>(column));
+			typeof(T).IsEnum 
+				? column.Table.Values(r => r[column].ParseEnum<T>()) 
+				: column.Table.Values(r => r.Field<T>(column));
+
+		public static IEnumerable<TResult> Values<TResult>(this DataTable self, Func<DataRow, TResult> selector) =>
+			self.Rows.Cast<DataRow>().Select(selector);
+
+		public static IEnumerable<TResult> Values<TResult>(this DataTable self, Func<DataRow, int, TResult> selector) =>
+			self.Rows.Cast<DataRow>().Select(selector);
 	}
 }
\ No newline at end of file
-- 
GitLab