У меня есть заскок, пытающийся сделать следующий метод более универсальным таким образом что любой List<T>
может быть передан в для columnValues
параметр. Вот то, что я имею:
public static DataRow NewRow(this DataTable dataTable, List<string> columnValues)
{
DataRow returnValue = dataTable.NewRow();
while (columnValues.Count > returnValue.Table.Columns.Count)
{
returnValue.Table.Columns.Add();
}
returnValue.ItemArray = columnValues.ToArray();
return returnValue;
}
Я мог изменить его на a List<object>
и преобразуйте исходный список до передачи его к методу, но я уверен, что существует более оптимальный вариант :-)
Править:
Сообщение Frank's заставило меня заново продумать это. В большинстве случаев тот источник List<T>
был бы a List<object>
так как значения столбцов, скорее всего, будут различными типами.
Для моего начального использования a List<string>
имевший смысл, потому что я создавал набор данных из синтаксического анализа CSV, который является всем текстом в той точке.
Вам в основном не повезло, потому что Item Array в DataRow представляет собой массив объектов, то есть в конечном итоге вы можете передать только список объектов.
Если вы добавите общий параметр списка, все элементы списка должны быть этого типа, что вряд ли будет полезно.
Сказав, что для получения множества столбцов, все с разными типами, вы можете изменить свой метод расширения, чтобы он принимал объект, в котором вы создаете экземпляр анонимного типа:
table.NewRow(new { A = "Hello", B = 1, C = DateTime.Now })
С помощью преобразования значений анонимного типа в строковый, объектный словарь путем отражения или динамического метода должен быть довольно полезной вещью.
Почему бы просто не использовать объект params []:
public static DataRow NewRow(this DataTable dataTable, params object[] objects)
{
DataRow returnValue = dataTable.NewRow();
while (objects.Length > returnValue.Table.Columns.Count)
{
returnValue.Table.Columns.Add();
}
returnValue.ItemArray = objects;
return returnValue;
}
Тогда вы можете просто назвать его так:
myDataTable.NewRow(1,2,"hello");
А как насчет
IEnumerable<object>
в связи с
columnValues.Select(x => x.ToString()).ToArray();
Как насчет использования замыкания для указания способа генерации ItemArray на основе вашего типа ввода
public static DataRow NewRow<T>(this DataTable dataTable, List<T> columnValues, Func<T, string> itemArrayCriteria)
{
DataRow returnValue = dataTable.NewRow();
while (columnValues.Count > returnValue.Table.Columns.Count)
{
returnValue.Table.Columns.Add();
}
returnValue.ItemArray = columnValues.Select(x => itemArrayCriteria(x)).ToArray();
return returnValue;
}