当前位置:  开发笔记 > 小程序 > 正文

将数据表转换为通用列表的最快方法

如何解决《将数据表转换为通用列表的最快方法》经验,为你挑选了2个好方法。

我有一个返回数据表的数据层选择方法.它是从业务层方法调用的,然后应该返回强类型的通用List.

我想做的是非常相似(但不一样)这个问题:
如何将DataTable转换为通用列表?

有什么不同之处在于我希望列表包含强类型对象而不是数据行(同样,我还没有这里可用的linq).

我很关心表现.然后将从表示层调用业务层方法,并且将迭代结果以显示给用户.在业务层添加额外的迭代似乎非常浪费,只能立即再次进行演示,所以我希望尽可能快.

这是一个常见的任务,所以我真的在寻找一个可以反复重复的好模式.



1> John..:

上面的示例问题是它非常慢.我有一个大约有400行的DataTable,这个转换需要5到6秒!

这似乎是一项非常常见的任务,所以我很惊讶没有在这里看到有更高效的解决方案.

*更新!!* 只是为了踢,我想我会尝试使用LINQ进行转换,而不是迭代DataTable并添加到我的List.以下是我的所作所为:

   List returnList = new List();

   MyDataTable dtMyData = new MyTableAdapter().GetMyData();

   returnLists = (from l in dtMyData
                 select new MyObject
                 {
                    Active = l.IsActive,
                    Email = l.Email,
                    //...
                    //About 40 more properties
                    //...
                    ZipCode = l.Zipcode
                  }).ToList();

第一种方法(遍历每一行)花了5.3秒,使用LINQ的方法耗时1.8秒!



2> Marc Gravell..:

您是否DataTable提前了解了打字对象的结构?您可以使用委托来执行映射.如果你不这样做(即你所知道的只是一个Type和属性),有很多方法可以加速动态成员访问(例如HyperDescriptor).

无论哪种方式,考虑一个迭代器块; 这样你不必第二次缓冲对象; 当然,如果你只处理小行数,这不是问题.

你能澄清其中的任何一点吗?我可以添加更多细节......

最简单的,有什么问题:

DataTable table = new DataTable {
    Columns = {
        {"Foo", typeof(int)},
        {"Bar", typeof(string)}
     }
};
for (int i = 0; i < 5000; i++) {
    table.Rows.Add(i, "Row " + i);
}

List data = new List(table.Rows.Count);
foreach (DataRow row in table.Rows) {
    data.Add(new MyType((int)row[0], (string)row[1]));
}

(以上问题可能引导正确的方法......)

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