接口返回值使用IEnumerable还是用list,还是IList

AI新视界 2017-04-06 01:46:42
加精
接口设计中,接口要返回一个集合,返回值使用IEnumerable<T>还是用list<T>,还是||IList<T>?原因是什么?
...全文
6529 60 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
60 条回复
切换为时间正序
请发表友善的回复…
发表回复
细嗅蔷薇 2017-04-20
  • 打赏
  • 举报
回复
又学到新姿势了
长空X 2017-04-19
  • 打赏
  • 举报
回复
引用 57 楼 hanjun0612 的回复:
[quote=引用 52 楼 hjkl950217 的回复:]
是不是IQueryable接口 是生成一个查询语句? 这里有点和SQL数据库的语句有点混..
然后就是EF中会大量用到linq 我查看了一下,是IEnumerable类型..如果数据量大的话,会不会比较消耗内存?

你说的很对
http://blog.csdn.net/hanjun0612/article/details/50070081
[/quote]看了这个博文,原来是这样..理解了...,但是我测试了一下(代码如下:),发现生成的SQL语句还是一样的

第二个不用AS运行不了,
上面是IQueryable类型,我推测是不是生成的SQL语句还是调用的IEnumerable接口的生成方法
环境是:VS2015+WIN10+.net4.5+EF6
正怒月神 版主 2017-04-13
  • 打赏
  • 举报
回复
引用 52 楼 hjkl950217 的回复:
是不是IQueryable接口 是生成一个查询语句? 这里有点和SQL数据库的语句有点混.. 然后就是EF中会大量用到linq 我查看了一下,是IEnumerable类型..如果数据量大的话,会不会比较消耗内存?
你说的很对 http://blog.csdn.net/hanjun0612/article/details/50070081
长空X 2017-04-10
  • 打赏
  • 举报
回复
引用 8 楼 hanjun0612 的回复:
[quote=引用 4 楼 u014180504 的回复:] 能举一些实际的应用场景分析下哪个场景哪个最实用的,就是一些最佳实践可以吗,谢谢了
就借着3楼说的。IEnumerable<T>和IQueryable<T> 的区别, IEnumerable<T> 是linq to object。 IQueryable<T> 是linq to sql。 打个比方,我从Users中获取1条数据 var q=db.Users.orderby(x=>x.id).Take(1); 对于IEnumerable<T>来说,他先会把所有数据加载到内存,然后在取一条数据。 对于IQueryable<T> 来说,他会生成一个sql语句,只是取一条数据 [/quote]是不是IQueryable接口 是生成一个查询语句? 这里有点和SQL数据库的语句有点混.. 然后就是EF中会大量用到linq 我查看了一下,是IEnumerable类型..如果数据量大的话,会不会比较消耗内存?
peng2739956 2017-04-10
  • 打赏
  • 举报
回复
说白了,其实这个问题就是一个迭代器的问题。。。。
peng2739956 2017-04-10
  • 打赏
  • 举报
回复
就比如 你需要返回一场串的Long 那这个方法也是

public static IEnumerable<long> AsLongModel()
        {
          
            return new long[] { };
        }
peng2739956 2017-04-10
  • 打赏
  • 举报
回复
在考虑性能的方面上,一般都是返回IEnumerable<T> 这个,我们公司的项目 严令禁止,实体数组不用IEnumerable<T>返回,禁止使用for,只能用LINQ 和Lambda表达式
卧_槽 2017-04-10
  • 打赏
  • 举报
回复
引用 30 楼 closurer 的回复:
我觉得这个问题还可以延伸到函数式编程的一些问题。 可以被 foreach 的迭代器,实际上是一个函数,一个函数返回一个 IEnumerable<T>,实际上是函数套函数。 [quote=引用 27 楼 zanfeng 的回复:] 表示从来不用2.0以上的语法特性。
那不是要返回 object[] 了吗?[/quote] 他们会用ArrayList
AI新视界 2017-04-10
  • 打赏
  • 举报
回复
希望大家说出自己的想法的同时也分享自己的设计思路,这样更有利于大家互相学习,
qq_16875871 2017-04-10
  • 打赏
  • 举报
回复
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
  • 打赏
  • 举报
回复
linq 返回值定义为 IEnumerable<T> --> linq to object 返回值定义为 IEnumerable<T> 实际上,linq provider 使用了 IQueryary<T> 这类定义,要比 IEnumerable<T>更具体。因为只有具体的东西,才真正能说明设计接口。linq to object 不具有这些功能,所以它声明到 IEnumerable<T> 这一层。而其它 provider 的原型则希望实现 IQueryary<T>。 相反相成才是设计。不论是在抽象还是具体,两个方面的测试系统、测试用例都能写得非常透彻,都仅仅做必要的事情。不是过分抽象,也不是不做抽象,是恰到好处地刚刚好有一大堆多态应用系统(在这一版本)就是发布的功能中需要这个接口。 抽象的时候,也都是尽可能具体地表达当前的升级、重构需求的。不是为了抽象而抽象。
  • 打赏
  • 举报
回复
软件设计没有什么永远正确的真理给你,唯一的真理就是要与时俱进地重构。在一段阶段内,你写了什么测试用例、搞了什么产品出来,你就定义哪一个级别的抽象接口。 相反相成才是设计,不要走极端。你写出了足以重构产品的测试用例,就让自己真的重构产品了。不要在你还写不出需要什么设计测试的案例时,就做纯理论的、不必要的“设计”。
  • 打赏
  • 举报
回复
linq 返回值定义为 IEnumerable<T>,那是因为它内涵最具体地就只能定义在这一级。而不是因为它要抽像地留有什么空白的中间地带。按照 LINQ 内涵,尽可能地给出最具体的定义,它的内涵只能定义到这一级别。 抽象都是恰到好处地抽象,才叫抽象。如果空洞地弄个什么 string、或者 object 来定义,就叫做万能的抽象了?那就不落地了!
AI新视界 2017-04-09
  • 打赏
  • 举报
回复
引用 31 楼 closurer 的回复:
[quote=引用 23 楼 u014180504 的回复:] [quote=引用 19 楼 closurer 的回复:] 从功能上看,没有什么好说的,因为 IEnumerable<T>、List<T>、IList<T> 都是可以互相转换的,无论你返回什么,都不会影响功能上的实现。 不同点是性能上的,假设你在函数里面已经得到了一个 IEnumerable<T>,因为受返回值的限制,执行了 ToList() 方法,这就执行了一次循环,假设这个函数的调用者根本不需要 List<T> 对象,只需要一个迭代器,于是他执行了 List<T> 的迭代器,这就又执行了一次循环……
嗯嗯,确实不能一概而论,肯定是要结合实际的应用场景来具体分析,能把这几个类型的最佳应用场景列举下大概,让我等新手能结合实际学习到更多。谢谢了[/quote] IEnumerable<T> 的应用场景,最典型的就是 System.Linq 的方法了,你可以思考一下为什么 Where<T>(Func<T, bool> predicate) 的返回值是 IEnumerable<T>?[/quote] 哦哦对,linq返回的都是 IEnumerable<T>,然后用的时候再转成想要的类型,是以为 IEnumerable<T>是所有的基类吗,他可以转成任何类型,完成不同的功能
AI新视界 2017-04-09
  • 打赏
  • 举报
回复
引用 28 楼 shingoscar 的回复:
能返回List就不要返回IList:如果后面有方法需要IList可以直接传;如果后面需要用到List的属性就能直接用 如果返回的是IList:后面有方法需要List,你得想想我能不能转,或者回去改;如果需要用到List的属性,还得回去改 综上考虑返回范围更广的类型好处多多
就是看调用方要做什么处理来选择用哪个返回类型
AI新视界 2017-04-09
  • 打赏
  • 举报
回复
引用 36 楼 closurer 的回复:
如果你留意 .net 的类库,会发现很少有方法返回 List<T> 或 IList<T> 的,但是不知道为什么很多 .net 的程序员喜欢这么做。 可能因为 List<T> 的功能实在太强大了吧。 我认为返回 T[] 或 IEnumerable<T> 会使你的函数的意思更加明确。
确实是这样的
baidu_27549073 2017-04-08
  • 打赏
  • 举报
回复
比如数据层老的技术是返回datatable,反来流行list<modle>这种类型,那我们应该采用哪种通用类型呢?这个可以模仿控件的datasource方法,想一想这两种类型为什么都能绑定到控件呢?
闭包客 2017-04-07
  • 打赏
  • 举报
回复
如果你留意 .net 的类库,会发现很少有方法返回 List<T> 或 IList<T> 的,但是不知道为什么很多 .net 的程序员喜欢这么做。 可能因为 List<T> 的功能实在太强大了吧。 我认为返回 T[] 或 IEnumerable<T> 会使你的函数的意思更加明确。
闭包客 2017-04-07
  • 打赏
  • 举报
回复
引用 25 楼 u014180504 的回复:
[quote=引用 15 楼 hanjun0612 的回复:] [quote=引用 10 楼 u014180504 的回复:] 那在IEnumerable<T>和Ilist<T>两者之间该如何恰当应用?
List<T>,IList<T>都是继承自IEnumerable<T>等等的接口。 其实从这方面,我们就知道List<T>比IList<T>强大,IList<T>比IEnumerable<T>强大。 而返回IEnumerable<T>只是由于调用方可能不一定需要List<T>,也可能是ICollection<T>等等。 所以一个接口存在许多派生情况的时候,使用基类型返回。 而如果只是单一的派生情况,那么久直接返回List<T>,而不是IEnumerable<T>。这里IList<T>的情况也是一样。 说这些,其实也是需要看调用方的具体需求。[/quote] 嗯嗯,因为以前听人说接口返回值范围要尽量小,也不太懂具体意思[/quote] 返回值范围,应该说的不是这个问题。 调用者需要 user_id = 1 的数据,你全部返回了,让调用者去筛选,这是返回值范围的问题。
f1ffffffasd 2017-04-07
  • 打赏
  • 举报
回复
for () { alert "8";}
加载更多回复(31)

62,242

社区成员

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

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

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

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