/// <summary>Converts a List of RowStore-objects into an array of T-objects on a best-effort-match basis. Parallelized. Does not throw on any mismatches.</summary> public static T[] ToObjectArray<T>(this IReadOnlyList<dynamic> listOfDynamic, Func<T> objectFactory) where T : class { unchecked { var listOfRowStore = (IReadOnlyList<RowStore>)listOfDynamic; int newListCount = listOfRowStore.Count; T[] newList = new T[newListCount]; if (newListCount == 0) return newList; RowStore firstElement = listOfRowStore[0]; int fieldCount = firstElement.RowValues.Length; var settersArray = new Action<T, object>[fieldCount]; var setters = ReflectionHelper_Setter<T>.Setters; var settersEnumerator = setters.GetEnumerator(); while (settersEnumerator.MoveNext()) { var setter = settersEnumerator.Current; if (firstElement.Schema.FieldMap.TryGetValue(setter.Key, out var index)) settersArray[index] = setter.Value; } Parallel.For(0, newListCount, s_ParallelOptions, i => { unchecked { T objT = objectFactory(); newList[i] = objT; object[] rowValues = (listOfRowStore[i]).RowValues; for (int j = 0; j < rowValues.Length; ++j) { var setter = settersArray[j]; if (setter != null) { object val = rowValues[j]; setter(objT, val == DBNull.Value ? null : val); } } } }); return newList; } }// ToObjectArray<T>()
public static T[] ToObjectArray<T>(this List<RowStore> listOfRowStore, Func<T> objectFactory) where T : class { unchecked { var listOfRowStoreAlias = listOfRowStore; int newArrayLength = listOfRowStoreAlias.Count; T[] newArray = new T[newArrayLength]; if (newArrayLength == 0) return newArray; var objectFactoryAlias = objectFactory; RowStore[] arrayOfRowStore = listOfRowStoreAlias.GetList_itemsArray(); ref RowStore firstElement = ref arrayOfRowStore[0]; var settersArray = new Action<T, object>[firstElement.RowValues.Length]; var fieldNames = firstElement.Schema.FieldNames; var settersMap = ReflectionHelper_Setter<T>.Setters; for (int i = 0; i < fieldNames.Length; ++i) { if (settersMap.TryGetValue(fieldNames[i], out var setter)) settersArray[i] = setter; } Parallel.For(0, newArrayLength, i => { T objT = objectFactoryAlias(); newArray[i] = objT; object[] rowValues = arrayOfRowStore[i].RowValues; for (i = 0; i < rowValues.Length; ++i) { settersArray[i]?.Invoke(objT, rowValues[i]); }//for }); return newArray; }//unchecked