Преобразуйте DataTable для списка <T>

Можно сделать, форма RAII в .NET и использовании Java завершает () методы. Завершение () перегрузку называют, прежде чем класс очищен GC и так может использоваться для чистки любых ресурсов, которые абсолютно не должны быть сохранены классом (взаимные исключения, сокеты, дескрипторы файлов, и т.д.). Это все еще не детерминировано все же.

С.NET можно сделать часть этого детерминировано с интерфейсом IDisposable и ключевым словом использования, но это действительно имеет ограничения (использующий конструкцию при использовании требуемый для детерминированного поведения, все еще никакое детерминированное освобождение памяти, не автоматически используемое в классах, и т.д.).

И да, я чувствую, что существует место для идей RAII, которые будут введены в.NET и другие управляемые языки, хотя точный механизм мог быть обсужден бесконечно. Единственная другая альтернатива, которую я видел, должна будет представить GC, который мог обработать произвольную очистку ресурса (не только память), но и затем у Вас есть проблемы, когда упомянутые средства абсолютно должны быть высвобождены детерминировано.

40
задан David Hoerster 31 December 2011 в 11:43
поделиться

3 ответа

The following does it in a single line:

dataTable.Rows.OfType<DataRow>()
    .Select(dr => dr.Field<MyType>(columnName)).ToList();

[Edit: Add a reference to System.Data.DataSetExtensions to your project if this does not compile]

42
ответ дан 27 November 2019 в 01:09
поделиться

Существуют методы расширения Linq для DataTable.

Добавьте ссылку на: System.Data.DataSetExtensions.dll

Затем включите пространство имен: с помощью System.Data .DataSetExtensions

Наконец, вы можете использовать расширения Linq в DataSet и DataTables:

var matches = myDataSet.Tables.First().Where(dr=>dr.Field<int>("id") == 1);

В .Net 2.0 вы все еще можете добавить общий метод:

public static List<T> ConvertRowsToList<T>( DataTable input, Convert<DataRow, T> conversion) {
    List<T> retval = new List<T>()
    foreach(DataRow dr in input.Rows)
        retval.Add( conversion(dr) );

    return retval;
}
18
ответ дан 27 November 2019 в 01:09
поделиться

Предполагая, что ваш DataRow наследуется от вашего собственного типа, скажем MyDataRowType , это должно работать:

List<MyDataRowType> list = new List<MyDataRowType>();

foreach(DataRow row in dataTable.Rows)
{
    list.Add((MyDataRowType)row);
}

Предполагается, как вы сказали в комментарий, что вы используете .NET 2.0 и не имеете доступа к методам расширения LINQ.

2
ответ дан 27 November 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: