Можно сделать, форма RAII в .NET и использовании Java завершает () методы. Завершение () перегрузку называют, прежде чем класс очищен GC и так может использоваться для чистки любых ресурсов, которые абсолютно не должны быть сохранены классом (взаимные исключения, сокеты, дескрипторы файлов, и т.д.). Это все еще не детерминировано все же.
С.NET можно сделать часть этого детерминировано с интерфейсом IDisposable и ключевым словом использования, но это действительно имеет ограничения (использующий конструкцию при использовании требуемый для детерминированного поведения, все еще никакое детерминированное освобождение памяти, не автоматически используемое в классах, и т.д.).
И да, я чувствую, что существует место для идей RAII, которые будут введены в.NET и другие управляемые языки, хотя точный механизм мог быть обсужден бесконечно. Единственная другая альтернатива, которую я видел, должна будет представить GC, который мог обработать произвольную очистку ресурса (не только память), но и затем у Вас есть проблемы, когда упомянутые средства абсолютно должны быть высвобождены детерминировано.
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]
Существуют методы расширения 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;
}
Предполагая, что ваш DataRow
наследуется от вашего собственного типа, скажем MyDataRowType
, это должно работать:
List<MyDataRowType> list = new List<MyDataRowType>();
foreach(DataRow row in dataTable.Rows)
{
list.Add((MyDataRowType)row);
}
Предполагается, как вы сказали в комментарий, что вы используете .NET 2.0 и не имеете доступа к методам расширения LINQ.