***高手们可帮忙解释一下麽

finer 2017-11-18 09:08:29
我正学习DataTable转List的方法,看到如下方法,代码比较简洁,但是不太懂,高手们可帮忙解释一下麽?

1.这里是List<IDictionary>,为什么是IDictionary呢?其他的可以吗?
2.什么DataTable要先AsEnumerable()
3.然后后面又有ToDictionary,ToList().ToArray()
4.最后再来个ToList<IDictionary>()
简洁是简洁,但是不清楚为什么

代码:
private List<IDictionary> ConvertToDictionary(DataTable dtObject)
{
var columns = dtObject.Columns.Cast<DataColumn>();

var dictionaryList = dtObject.AsEnumerable()
.Select(dataRow => columns
.Select(column =>
new { Column = column.ColumnName, Value = dataRow[column] })
.ToDictionary(data => data.Column, data => data.Value)).ToList().ToArray();

return dictionaryList.ToList<IDictionary>();
...全文
193 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
finer 2017-11-18
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
对于“动态编程而言”,现在使用 ExpandoObject 和 dynamic 技术要比所谓的 IDictionary 更靠谱、更完整、更强大。所以转为 List<ExpandoObject> 不但可以实现 List<IDictionary<string,object>>同样的功能,也更加适合 dynamic 技术需求。 而转换大致可以这样写(随便写的,没有测试,理解就好)
public List<ExpandoObject> ConvertToDictionary(DataTable dtObject)
{
    var createExpando = new Func<DataRow, ExpandoObject>(r =>
    {
        var obj = new ExpandoObject();
        var dic = (IDictionary<string, object>)obj;
        foreach (DataColumn c in r.Table.Columns)
            dic.Add(c.ColumnName, r[c]);
        return obj;
    });
    return (from DataRow row in dtObject.Rows
            select createExpando(row)).ToList();
}
这里把 DataTable 对象转换为 List<ExpandoObject> 对象。 当让前提是,你要有同样的需求,进入同样的门槛,才知道别人为什么要转换。
谢谢,又看到新东西了。
  • 打赏
  • 举报
回复
对于“动态编程而言”,现在使用 ExpandoObject 和 dynamic 技术要比所谓的 IDictionary 更靠谱、更完整、更强大。所以转为 List<ExpandoObject> 不但可以实现 List<IDictionary<string,object>>同样的功能,也更加适合 dynamic 技术需求。 而转换大致可以这样写(随便写的,没有测试,理解就好)
public List<ExpandoObject> ConvertToDictionary(DataTable dtObject)
{
    var createExpando = new Func<DataRow, ExpandoObject>(r =>
    {
        var obj = new ExpandoObject();
        var dic = (IDictionary<string, object>)obj;
        foreach (DataColumn c in r.Table.Columns)
            dic.Add(c.ColumnName, r[c]);
        return obj;
    });
    return (from DataRow row in dtObject.Rows
            select createExpando(row)).ToList();
}
这里把 DataTable 对象转换为 List<ExpandoObject> 对象。 当让前提是,你要有同样的需求,进入同样的门槛,才知道别人为什么要转换。
  • 打赏
  • 举报
回复
引用 楼主 finer 的回复:
1.这里是List<IDictionary>,为什么是IDictionary呢?其他的可以吗?
什么要 List<IDictionary>你要问程序设计人员。技术是最低级的东西,需求才是根本。所以一切都在于自己,在于有灵感有悟性的设计人员。你如果只是问代码“为什么”,抛开一个人的一整套设计需求来说,代码怎么回答?
  • 打赏
  • 举报
回复
一个设计师,他必定是有一整套基于 List<IDictionary> 的架构想法,所以才需要适配。你不问“人”而问代码,这是本末倒置的。
圣殿骑士18 2017-11-18
  • 打赏
  • 举报
回复
引用 6 楼 finer 的回复:
[quote=引用 5 楼 daixf_csdn 的回复:] 看来你还是需要先通盘的学习一下linq。 如果你会linq,他的这些眼花缭乱的转换并不难理解,不就是找到一个简便的方法,把数据转换为需求所需要的类型。 不过这些用法,有点过于炫技了,有些方法我都没用过。p哥写的直接用foreach,更加朴素易阅读,执行效率也更高。 毕竟各种类型转换都是需要付出性能代价的,我看他总共做了6次数据类型转换,并不建议搞的这些复杂。
哦,谢谢! p哥是谁啊,分享一下他的文章学习啦[/quote] 3楼
finer 2017-11-18
  • 打赏
  • 举报
回复
引用 5 楼 daixf_csdn 的回复:
看来你还是需要先通盘的学习一下linq。 如果你会linq,他的这些眼花缭乱的转换并不难理解,不就是找到一个简便的方法,把数据转换为需求所需要的类型。 不过这些用法,有点过于炫技了,有些方法我都没用过。p哥写的直接用foreach,更加朴素易阅读,执行效率也更高。 毕竟各种类型转换都是需要付出性能代价的,我看他总共做了6次数据类型转换,并不建议搞的这些复杂。
哦,谢谢! p哥是谁啊,分享一下他的文章学习啦
圣殿骑士18 2017-11-18
  • 打赏
  • 举报
回复
看来你还是需要先通盘的学习一下linq。 如果你会linq,他的这些眼花缭乱的转换并不难理解,不就是找到一个简便的方法,把数据转换为需求所需要的类型。 不过这些用法,有点过于炫技了,有些方法我都没用过。p哥写的直接用foreach,更加朴素易阅读,执行效率也更高。 毕竟各种类型转换都是需要付出性能代价的,我看他总共做了6次数据类型转换,并不建议搞的这些复杂。

62,051

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧