加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 何时使用List,IEnumerable和ArrayList

发布时间:2020-12-16 00:19:42 所属栏目:百科 来源:网络整理
导读:我的问题非常简单.我什么时候应该使用List,IEnumerable和ArrayList. 这是我的情景.我正在使用LINQ在Web应用程序中工作.信息以IEnumerable的形式返回: IEnumerableInventory result = from Inventory i in db where.... 我不确定IEnumerable是如何工作的,但
我的问题非常简单.我什么时候应该使用List,IEnumerable和ArrayList.

这是我的情景.我正在使用LINQ在Web应用程序中工作.信息以IEnumerable的形式返回:

IEnumerable<Inventory> result = from Inventory i in db where....

我不确定IEnumerable是如何工作的,但是每个操作都需要花费很多时间来执行.更具体地说,result.Count(),result.ElementAt(i),result.ToList等,每个操作都需要相当长的时间.

所以,我想知道我是否应该通过执行result.ToList将其视为List,而不是使用IEnumerable变量.

谢谢!

解决方法

如果我理解你正在做什么,你会在db select i中有一个类似于Inventory i的查询,然后你对结果做了几个操作:

var count = result.Count();
var fifth = result.ElementAt(5);
var allItems = result.ToList();

现在考虑将查询作为不同类型时会发生什么:

> IQueryable< T>

var result = from Inventory i in db select i;
IQueryable<Inventory> result = from Inventory i in db select i;

上面两行是相同的.它们实际上并没有进入数据库,只是创建了查询的表示.如果你有这个,Count()将执行一个SQL查询,如SELECT COUNT(*)FROM Inventory,ElementAt(5)将执行另一个只占用表中第五项的查询,ToList()将执行类似SELECT * FROM的操作库存,但这就是我们想要的.
> IEnumerable< T>

IEnumerable<Inventory> result = from Inventory i in db select i;

再次执行此操作不会进入数据库,它只会创建查询的表示形式.但它是一种不能使用特定于IQueryable< T>的方法的表示,因此任何LINQ操作都将枚举该集合,该集合将执行SELECT * FROM Inventory之类的SQL查询.

因此,对于示例:Count()将仅执行SELECT * …查询以计算结果中的项目. ElementAt(5)将再次执行整个查询,只丢掉除第五个以外的所有项目. ToList()将再次执行查询.
>列表< T>

List<Inventory> result = (from Inventory i in db select i).ToList();

这实际上会立即执行SELECT * FROM Inventory查询.您对结果执行的所有操作都不会触及数据库,它们将在内存中完成.

你应该从中拿走什么?首先,永远不要使用IEnumerable< T>作为数据库查询的类型.它表现糟糕.

如果要对结果进行多个不同的操作,请使用IQueryable< T>可能是最好的解决方案.

如果您想要检索整个结果,请尽快使用ToList()(或ToArray()),然后使用生成的List< T>.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读