列表到数据表的转换 [英] Conversion of List to DataTable

查看:788
本文介绍了列表到数据表的转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我想了解一些有关List< object>的转换的信息.到DataTable.
我已经在Google和Codeproject上搜索了它,发现了一些文章,但是每篇文章都说要迭代已经实现的List.

现在,我想知道,还有其他更好的方法吗?
如果有人可以帮助我,那对我来说太好了.


提前谢谢.

问候
AR

Hi,

I want to know something about Conversion of List<object> to DataTable.
I have searched for it on Google and Codeproject and found some article but every article says to iterate the List which I have already implemented.

Now, I want to know, is there any other better way to do this?
If any body can help me then it would be great for me.


Thanks in advance.

Regards
AR

推荐答案

为什么要避免迭代?

如果要减少代码,请使用LINQ(技术上仍然会迭代,但看起来不太像这样做):
Why do you want to avoid iteration?

If it is to reduce code, use LINQ (technically still iterates, but looks less like it''s doing that):
List<object> x = new List<object>();
DataTable d = new DataTable();
d.Columns.Add("item");
x.ForEach((item) => d.Rows.Add(item));



如果要避免对处理每个项目造成立即的性能损失,可以从DataTable派生一个类,该类在内部包装List:



If you want to avoid the immediate performance hit of processing each item, you can derive a class from DataTable that wraps a List internally:

public class MyDataTable<T> : DataTable
{
    private List<T> internalList { get; set; }
    public MyDataTable(List<T> p_internalList)
    {
        this.internalList = p_internalList;
    }
    //TODO: Your implementation here.
}


可以肯定的是,还使用了List.AsReadOnly()返回的ReadOnlyCollection的包装技术.


Pretty sure that wrapping technique is also used with the ReadOnlyCollection returned from List.AsReadOnly().


下面是完整的功能代码.它考虑所有列表对象的数据类型,甚至检查Nullable.

Here is the full functioning code. It consider all the list object datatype and even check Nullable.

/// <summary>
/// Converts a Generic List into a DataTable.
/// </summary>
/// <param name="genericList">Generic list</param>
/// <returns>DataTable object</returns>
private static DataTable GenericListToDataTable(object genericList)
{
    DataTable dataTable = null;
    Type listType = genericList.GetType();

    if (listType.IsGenericType & (genericList != null)) {
        //determine the underlying type the List<> contains
        Type elementType = listType.GetGenericArguments()[0];

        //create empty table -- give it a name in case
        //it needs to be serialized
        dataTable = new DataTable(elementType.Name + "List");

        //define the table -- add a column for each public
        //property or field
        MemberInfo[] memberInfos = elementType.GetMembers(BindingFlags.Public | BindingFlags.Instance);
        foreach (MemberInfo memberInfo in memberInfos) {
            if (memberInfo.MemberType == MemberTypes.Property) {
                PropertyInfo propertyInfo = memberInfo as PropertyInfo;
                if (IsNullableType(propertyInfo.PropertyType)) {
                    dataTable.Columns.Add(propertyInfo.Name, new NullableConverter(propertyInfo.PropertyType).UnderlyingType);
                } else {
                    dataTable.Columns.Add(propertyInfo.Name, propertyInfo.PropertyType);
                }
            } else if (memberInfo.MemberType == MemberTypes.Field) {
                FieldInfo fieldInfo = memberInfo as FieldInfo;
                dataTable.Columns.Add(fieldInfo.Name, fieldInfo.FieldType);
            }
        }

        //populate the table
        IList listData = genericList as IList;
        foreach (object record in listData) {
            int index = 0;
            object[] fieldValues = new object[dataTable.Columns.Count];
            foreach (DataColumn columnData in dataTable.Columns) {
                MemberInfo memberInfo = elementType.GetMember(columnData.ColumnName)[0];
                if (memberInfo.MemberType == MemberTypes.Property) {
                    PropertyInfo propertyInfo = memberInfo as PropertyInfo;
                    fieldValues[index] = propertyInfo.GetValue(record, null);
                } else if (memberInfo.MemberType == MemberTypes.Field) {
                    FieldInfo fieldInfo = memberInfo as FieldInfo;
                    fieldValues[index] = fieldInfo.GetValue(record);
                }
                index += 1;
            }
            dataTable.Rows.Add(fieldValues);
        }
    }
    return dataTable;
}

/// <summary>
/// Check if a type is Nullable type
/// </summary>
/// <param name="propertyType">Type to be checked</param>
/// <returns>true/false</returns>
/// <remarks></remarks>
private static bool IsNullableType(Type propertyType)
{
    return (propertyType.IsGenericType) && (object.ReferenceEquals(propertyType.GetGenericTypeDefinition(), typeof(Nullable<>)));
}


尝试一下
http://stackoverflow.com/questions/564366/generic-list-to-datatable [ ^ ]
try this
http://stackoverflow.com/questions/564366/generic-list-to-datatable[^]


这篇关于列表到数据表的转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆