IEnumerable<T> VS IList<T> VS IQueryable<T>

Posted

技术标签:

【中文标题】IEnumerable<T> VS IList<T> VS IQueryable<T>【英文标题】: 【发布时间】:2011-04-05 22:28:07 【问题描述】:

对于 MVC.net 场景(以及 .net)来说是新手,但是当我想用数据填充“列表”时,我似乎找到了很多选择。就我目前而言,我想从项目的选择查询中填充一个列表,并以 JSON 格式呈现结果以供输出,所以请耐心等待......

所以,我的视图模型类是这样的:

[Serializable()]
public class TFSquery 

    public int MsgUid  get; set; 
    public DateTime CreateStamp  get; set;     

然后我想用我的查询输出填充它:

List<TFSquery> z = (from msg in _DB.Msg 
                    select new  msg.MsgUID, msg.CreateStamp ).ToList();

然后我会将输出循环到我的列表中,以便我可以在我的 Json 返回字符串中输出?当我使用 LIST VS IENUMERABLE VS IQUERYABLE??

return Json(new  Result = z , JsonRequestBehavior.AllowGet);     

【问题讨论】:

【参考方案1】:

我的经验法则:

当您必须按索引添加、删除或引用项目时,请使用列表。

当您必须针对它运行临时查询时,请使用 IQueryable

默认使用IEnumerable

看起来您已经在“在”您的数据库中进行查询,所以我建议使用最简单的版本:IEnumerable 以便能够简单地遍历结果。

【讨论】:

实际上如果可能的话,var 关键字应该在这种情况下使用,那么您不必担心将类型转换到任何地方。只需将其更改为var z = ...,最后不添加ToList()。这可能会保留它IQueryable,但无论如何它都继承自IEnumerable 添加/删除时 T 的 ICollection,还需要索引时 T 的 IList(或 T[])。大多数事情只需要 T 的 IEnumerable 就可以解决,这对于在公共接口中公开非常有用。我很少再使用 List 了。【参考方案2】:

如果您是 .NET 和 C# 的新手,我会花一些时间研究并了解不同的集合类型是什么、它们有何不同以及何时使用它们。您会经常使用集合,以至于您无法像其他回答者发布的那样拥有“简单的单行”摘要理解。

这里有一个很好的 .NET 集合类型指南: http://msdn.microsoft.com/en-us/library/0ytkdh4s.aspx

IQueryable 是它自己的特殊野兽,值得拥有自己的指南: http://msdn.microsoft.com/en-us/library/system.linq.iqueryable.aspx

【讨论】:

+1 最佳答案通常是指向适当来源的答案。感谢您发布 MSDN 链接!【参考方案3】:

每个接口都有自己的一组用途。

IQueryable 用于延迟查询(即保存查询但仅在枚举时执行)

IEnumerable 可以枚举,仅此而已。

IList 可以添加和删除项目。

【讨论】:

IEnumerable 也是延迟执行。 IEnumerable 也可用于延迟执行。例如,请参阅Enumerable.Reverse。它返回一个IEnumerable&lt;TSource&gt;,但在枚举第一个元素之前不会开始实际的反转。

以上是关于IEnumerable<T> VS IList<T> VS IQueryable<T>的主要内容,如果未能解决你的问题,请参考以下文章

返回 IEnumerable<T> 与 IQueryable<T>

Parallel.ForEach() 与 foreach(IEnumerable<T>.AsParallel())

c# IEnumerable<T>

List<T>,ArrayList,IEnumerable的区别

将 IEnumerable<Ienumerable<T>> 转换为 Dictionary<key,IEnumerable<T>>

返回 IHttpActionResult vs IEnumerable<Item> vs IQueryable<Item>