首页 新闻 会员 周边

C#为何感觉有些不够优雅

-2
悬赏园豆:100 [待解决问题]

今天早上看到博客园上一篇喷java的泛型鸡肋的文章,感觉所言甚是,真的很鸡肋,当时心中对C#可谓又增加一步好感。但好景总是不长,下午优化代码的时候,就遇到了C#了让我感觉不够优雅的地方。

linq可谓C#中的神来之笔,其优点简直罄竹难书。所以,你没有理由不拥抱这个龙之睛,当然我也拥抱了,拥抱之余却发现,linq是不是C#半路想出来的东西的,直到2.0的时候估计他的架构者们都没想过这个查询结构设计。

ForEach配合Action,Select配合Func,各种神器,几乎所向披靡,你发现代码简化到就差要去删注释了。但你却不得不发现一个问题,ForEach不是linq的扩展方法,神啊,他竟然是硬编码的,不是针对某个接口,而是具体某个类型,如List里面有一个方法叫ForEach,啥子状况,那我不ToList还用不了这个特性了?

然后,看代码,数组里面也有ForEach,更郁闷,这个和List的还不一样。

然后你发现各种Collection结尾的数据类型,其不是泛型的,当然,你也就发现其失去一大堆方法。

这个算C#不优雅的地方么?DataTable的Rows最后只能DataTableAsEnumerable().AsQueryable(),那DatGridView的Row呢。。。。难道我要转变成IQueryable,然后手动设置Expression???

 

求大神帮忙解释或者帮我解决这一类问题(别让我手动遍历下Collection结尾的这帮怪物)

BLoodMaster的主页 BLoodMaster | 初学一级 | 园豆:135
提问于:2014-06-23 13:44
< >
分享
所有回答(10)
0

ForEach是对于实现了IEnumerable接口的集合才能用

刘宏玺 | 园豆:14020 (专家六级) | 2014-06-23 14:19

转到csdn上问问题了。离开博客园这个旮旯。这里的编辑基本猪脑子,受不了了。几年前曾有人发帖喷过

支持(0) 反对(0) BLoodMaster | 园豆:135 (初学一级) | 2014-06-23 14:32
0

这和C#不够优雅有什么关系。

楼主有没有想过为什么需要把DataRow映射成一个具体的实体?

如果DatGridView的DataSource是个具体实体的List,问题不就解决了?

Firen | 园豆:5385 (大侠五级) | 2014-06-23 15:33

你说的这个我还真没思考过

支持(0) 反对(0) BLoodMaster | 园豆:135 (初学一级) | 2014-06-23 15:43

@BLoodMaster: 

1、LINQ是语言集成查询吧?ForEach像是查询吗?你看看LINQ的方法几个没有返回值的?还有,LINQ返回值是集合的方法大都延迟查询,而到ForEach就执行了。另外数组和List方法你可以看看源代码,数组是可以用索引访问元素的,但实现了IEnumerable、IQueryable接口的集合不一定都能用索引......

2、DataTable是个内存表,DatGridView是个控件啊,两个完全不同的东西为什么要统一?ASP.net、WinForm、WPF的GridView也不需要一样啊!

支持(0) 反对(0) C#开发人员 | 园豆:181 (初学一级) | 2014-06-23 22:27
0

在讨论中同时出现优雅和DataTable这2个关键字.......

吴瑞祥 | 园豆:29449 (高人七级) | 2014-06-23 18:50

自从用了LINQ,

实在是没有多少机会用到Datatable,已经快忘了当年初入ADO.NET时如何被Datatable折磨的事了。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-06-24 10:17

@爱编程的大叔: 现在做事情,看到别人用datatable传值,就算有现成方法,我也要重新写一个``

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-06-24 10:30

现在我已经算彻底离开EF那种思路了,没事整什么实体框架,水平分割看似霸气侧漏,实际上,除了增加代码,除了增加修改成本,没看到半点灵活性。还不如实实在在的垂直分割子系统来得靠谱,且开发进度有保障。至于EF这种类型的东西,我只能说有点鸡肋吧,好处很多,配合上TT模板,你感觉你想干啥都行,但对于项目大些的,没看到多少优势。DataTable支持序列化,为何不能作为网络传输的载体,配合上lambda,前端逻辑处理不知道多简化,而且想扩展就扩展。

支持(0) 反对(0) BLoodMaster | 园豆:135 (初学一级) | 2014-06-24 11:03

@BLoodMaster: EF用起来简单,想用好非常难,我现在也不用EF了.但我不用的原因是因为我觉得自己水平不够.想用好EF程序结构设计非常非常重要.我现在也只是用简单Dapper做表-实体映射.EF基本上就是被用来生成实体类的.DataTable传输之后.在前台.对方想知道里面有什么值,都很麻烦.而且如果接口发生修改了.调用方是不知道.这个就是弱类型存在的问题.你如果自己做自己用,那肯定没有问题.如果有一天另一个人接收了你的项目,看到整个项目全是Datatable.他的心里只有2个字  我艹```

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-06-24 11:14

@吴瑞祥: 我艹······

支持(0) 反对(0) iEvent | 园豆:529 (小虾三级) | 2014-06-24 11:49

@BLoodMaster: DataTable 跟实体比,确实是多了一层转换的时间消耗,但是你的代码给人家维护人家一定要去读懂去记熟你定义的第一个字段是什么数据第二个字段是什么数据么   直接不要OO不要用c#,退回以前asp年代玩数据集算了~~

支持(0) 反对(0) str.chan | 园豆:16 (初学一级) | 2014-06-24 16:31
0

罄竹难书是形容不好的事情的 您用错地方了

GoYF | 园豆:13 (初学一级) | 2014-06-24 14:15

人生已是如此艰难,有些事情何必拆穿...

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-06-24 15:03
0

好多人有意见,我也说说我的。

1、优雅,一般说来几乎等同于慢,所以别喷LINQ慢,我看到那些喷LINQ慢的人都不知道说啥好呢。

谁没事整个Select * from table一万遍啊。

2、实体类,主要是为了避免双引号“”。(这句比较粗俗一点,别喷,想要说的阳春白雪比较麻烦),

不知道是否这样是你所谓的优雅,我就不知道DataTable如何避免双引号。

不过好像也有强类型的DataRow。

3、前些天,我为了不想在函数中使用双引号,问了朋友,没答案,后来一不小心在很早以前的一个外文博客上找到了,不过也是用性能换优雅,好慢的说。

这儿顺便考考大家,有没有人知道如何实现这样一个函数或是扩展

function abc(Model myModel, FieldList) as iqueryable

说明,fieldlist希望开发员引用的时候不出现双引号,可以使用myModel的属性提醒。

返回的Iqueryable只包含FieldList中的属性字段。

 

4、我开发了这么多年,发现自己一直致力于寻找性能差的技术...

比如WCF Data Service,我居然发现他能解决我开发中一直不能解决的一个问题。

真希望微软多开发一些慢技术。

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-06-24 15:24
0

LINQ是语言集成查询.

别跟Foreach扯在一起比较。

刘志勇 | 园豆:261 (菜鸟二级) | 2014-06-24 16:54

别那么教条了。我给IEnumerable自己加了一个Foreach扩展方法。一切OK了

支持(0) 反对(2) 五星 | 园豆:125 (初学一级) | 2014-06-25 23:08
0

显然是你对这几个类型的职责认识不够优雅

不浮躁 | 园豆:144 (初学一级) | 2014-06-25 15:05
0

什么是优雅,给解释一下,我一个纯粹的的理科生,完全不明白这个词什么意思,每次听到说"代码优雅"就跟吃到苍蝇一样的感觉!!!

singin | 园豆:202 (菜鸟二级) | 2014-06-26 11:35
0

你看起来优雅的代码,编译后简直就是一坨屎,哦,不,两坨屎。

Timetombs | 园豆:3954 (老鸟四级) | 2014-06-27 17:01
0

不懂

黄药师V | 园豆:202 (菜鸟二级) | 2014-06-30 11:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册