当前位置:  开发笔记 > 编程语言 > 正文

如何将DataTable转换为通用列表?

如何解决《如何将DataTable转换为通用列表?》经验,为你挑选了9个好方法。

目前,我正在使用:

DataTable dt = CreateDataTableInSomeWay();

List list = new List(); 
foreach (DataRow dr in dt.Rows)
{
    list.Add(dr);
}

有更好的/神奇的方式吗?



1> Jon Skeet..:

如果你使用的是.NET 3.5,你可以使用DataTableExtensions.AsEnumerable(一种扩展方法)然后如果你真的需要一个List而不仅仅是IEnumerable你可以调用Enumerable.ToList:

IEnumerable sequence = dt.AsEnumerable();

要么

using System.Linq;
...
List list = dt.AsEnumerable().ToList();


@Pandiya:在.NET中有多种方法可以将数据转换为JSON.我个人总是使用JSON.NET库,但也有其他方法.

2> 小智..:
List emp = new List();

//Maintaining DataTable on ViewState
//For Demo only

DataTable dt = ViewState["CurrentEmp"] as DataTable;

//read data from DataTable 
//using lamdaexpression


emp = (from DataRow row in dt.Rows

   select new Employee
   {
       _FirstName = row["FirstName"].ToString(),
       _LastName = row["Last_Name"].ToString()

   }).ToList();



3> Marc Gravell..:

使用C#3.0和System.Data.DataSetExtensions.dll,

List rows = table.Rows.Cast().ToList();


这样做有助于通过在数据行上使用foreach 50%的时间来实现性能.

4> Kibbee..:

你可以用

List list = new List(dt.Select());

dt.Select()将返回表中的所有行,作为数据行数组,List构造函数接受该对象数组作为参数,以便最初填充列表.



5> Rahul Garg..:

您可以创建扩展功能:

public static List ToListof(this DataTable dt)
{
    const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
    var columnNames = dt.Columns.Cast()
        .Select(c => c.ColumnName)
        .ToList();
    var objectProperties = typeof(T).GetProperties(flags);
    var targetList = dt.AsEnumerable().Select(dataRow =>
    {
        var instanceOfT = Activator.CreateInstance();

        foreach (var properties in objectProperties.Where(properties => columnNames.Contains(properties.Name) && dataRow[properties.Name] != DBNull.Value))
        {
            properties.SetValue(instanceOfT, dataRow[properties.Name], null);
        }
        return instanceOfT;
    }).ToList();

    return targetList;
}


var output = yourDataInstance.ToListof();



6> Stuart..:

如果您只想要返回"ID"int字段中的值列表,则可以使用...

List ids = (from row in dt.AsEnumerable() select Convert.ToInt32(row["ID"])).ToList();



7> Bondaryuk Vl..:

我已经从这个答案(/sf/ask/17360801/)添加了一些修改代码,因为对于可为空的类型,它将返回异常

public static List DataTableToList(this DataTable table) where T: new()
{
    List list = new List();
    var typeProperties = typeof(T).GetProperties().Select(propertyInfo => new
        {
            PropertyInfo = propertyInfo,
            Type = Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType
        }).ToList();

    foreach (var row in table.Rows.Cast())
    {
        T obj = new T();
        foreach (var typeProperty in typeProperties)
        {
            object value = row[typeProperty.PropertyInfo.Name];
            object safeValue = value == null || DBNull.Value.Equals(value)
                ? null
                : Convert.ChangeType(value, typeProperty.Type);

            typeProperty.PropertyInfo.SetValue(obj, safeValue, null);
        }
        list.Add(obj);
    }
    return list;
}



8> Morteza..:
using System.Data;


var myEnumerable = myDataTable.AsEnumerable();

List myClassList =
    (from item in myEnumerable
     select new MyClass{
         MyClassProperty1 = item.Field("DataTableColumnName1"),
         MyClassProperty2 = item.Field("DataTableColumnName2")
    }).ToList();



9> Guilherme Du..:

再次使用3.5你可能会这样做:

dt.Select().ToList()

BRGDS

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有