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<TSource>
,但在枚举第一个元素之前不会开始实际的反转。以上是关于IEnumerable<T> VS IList<T> VS IQueryable<T>的主要内容,如果未能解决你的问题,请参考以下文章
返回 IEnumerable<T> 与 IQueryable<T>
Parallel.ForEach() 与 foreach(IEnumerable<T>.AsParallel())
List<T>,ArrayList,IEnumerable的区别
将 IEnumerable<Ienumerable<T>> 转换为 Dictionary<key,IEnumerable<T>>
返回 IHttpActionResult vs IEnumerable<Item> vs IQueryable<Item>