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