何时使用List <T>,IEnumerable <T>和ArrayList

Gon*_*alo 3 c# asp.net ienumerable list

我的问题很简单.我什么时候应该使用List,IEnumerable和ArrayList.

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

IEnumerable<Inventory> result = from Inventory i in db where.... 
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

svi*_*ick 6

如果我理解你正在做什么,你有一个查询from Inventory i in db select i,然后你对结果做了几个操作:

var count = result.Count();
var fifth = result.ElementAt(5);
var allItems = result.ToList();
Run Code Online (Sandbox Code Playgroud)

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

  • IQueryable<T>

    var result = from Inventory i in db select i;
    IQueryable<Inventory> result = from Inventory i in db select i;
    
    Run Code Online (Sandbox Code Playgroud)

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

  • IEnumerable<T>

    IEnumerable<Inventory> result = from Inventory i in db select i;
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  • List<T>

    List<Inventory> result = (from Inventory i in db select i).ToList();
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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