none
ArrayList转换为datatable RRS feed

答案

  • 你好:

    欢迎来到MSDN中文论坛。

    经过测试这个方法对于一般的ArrayList都可以正常转换为DataTable,如果你的转换有问题,那么请把你拥json.net反序列化出来的ArrayList贴出来供大家测试,并且把你看到的异常信息贴出来。

    顺便说一下,自从.net2.0以后已经不推荐使用ArrayList类来存储信息,你应该使用List<T>这个泛型集合来替代它。

    以下是简单的测试代码,没有问题:

    class Program
        {
            static void Main(string[] args)
            {
                ArrayList arr = new ArrayList() 
                { 
                    new MyItem("item1_p1","item1_p2","item1_p3"),
                    new MyItem("item2_p1","item2_p2","item2_p3"),
                    new MyItem("item3_p1","item3_p2","item3_p3")
                };
    
                DataTable dt = ToDataTable(arr);
    
                Console.Read();
            }
    
            public static DataTable ToDataTable(ArrayList list)
            {
                DataTable result = new DataTable();
                if (list.Count > 0)
                {
                    PropertyInfo[] propertys = list[0].GetType().GetProperties();
                    foreach (PropertyInfo pi in propertys)
                    {
                        result.Columns.Add(pi.Name, pi.PropertyType);
                    }
    
                    for (int i = 0; i < list.Count; i++)
                    {
                        ArrayList tempList = new ArrayList();
                        foreach (PropertyInfo pi in propertys)
                        {
                            object obj = pi.GetValue(list[i], null);
                            tempList.Add(obj);
                        }
                        object[] array = tempList.ToArray();
                        result.LoadDataRow(array, true);
                    }
                }
                return result;
            }
    
    
        }
    
        class MyItem
        {
            public MyItem(string p1, string p2, string p3)
            {
                MyProperty1 = p1;
                MyProperty2 = p2;
                MyProperty3 = p3;
            }
            public string MyProperty1 { get; set; }
            public string MyProperty2 { get; set; }
            public string MyProperty3 { get; set; }
    
        }


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年4月17日 2:36
    版主

全部回复

  • http://friendship517.blog.163.com/blog/static/57051278200862992416946/

    2014年4月16日 5:10
  • 网上的方法基本也是这样,但是我的arraylist是json.net反序列化出来的,在运行到

    foreach (PropertyInfo pi in propertys)
                    {
                        result.Columns.Add(pi.Name, pi.PropertyType);
                    }

    这里的时候,pi.Name提示Item已经存在于datatable中。本身是没有这个字段的。


    2014年4月16日 5:30
  • 你好:

    欢迎来到MSDN中文论坛。

    经过测试这个方法对于一般的ArrayList都可以正常转换为DataTable,如果你的转换有问题,那么请把你拥json.net反序列化出来的ArrayList贴出来供大家测试,并且把你看到的异常信息贴出来。

    顺便说一下,自从.net2.0以后已经不推荐使用ArrayList类来存储信息,你应该使用List<T>这个泛型集合来替代它。

    以下是简单的测试代码,没有问题:

    class Program
        {
            static void Main(string[] args)
            {
                ArrayList arr = new ArrayList() 
                { 
                    new MyItem("item1_p1","item1_p2","item1_p3"),
                    new MyItem("item2_p1","item2_p2","item2_p3"),
                    new MyItem("item3_p1","item3_p2","item3_p3")
                };
    
                DataTable dt = ToDataTable(arr);
    
                Console.Read();
            }
    
            public static DataTable ToDataTable(ArrayList list)
            {
                DataTable result = new DataTable();
                if (list.Count > 0)
                {
                    PropertyInfo[] propertys = list[0].GetType().GetProperties();
                    foreach (PropertyInfo pi in propertys)
                    {
                        result.Columns.Add(pi.Name, pi.PropertyType);
                    }
    
                    for (int i = 0; i < list.Count; i++)
                    {
                        ArrayList tempList = new ArrayList();
                        foreach (PropertyInfo pi in propertys)
                        {
                            object obj = pi.GetValue(list[i], null);
                            tempList.Add(obj);
                        }
                        object[] array = tempList.ToArray();
                        result.LoadDataRow(array, true);
                    }
                }
                return result;
            }
    
    
        }
    
        class MyItem
        {
            public MyItem(string p1, string p2, string p3)
            {
                MyProperty1 = p1;
                MyProperty2 = p2;
                MyProperty3 = p3;
            }
            public string MyProperty1 { get; set; }
            public string MyProperty2 { get; set; }
            public string MyProperty3 { get; set; }
    
        }


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年4月17日 2:36
    版主