声明IEnumerable< T>变量以供以后使用
本文关键字:变量 IEnumerable 声明 | 更新日期: 2023-09-27 18:13:59
我有一个LINQ查询,如:
using(csv.......)
{
csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) });
}
//Do some stuff
//Now I want to use the result of the query
foreach(var item in ??)
{
}
查询返回IEnumerable在我的using
语句,但我如何声明,然后分配一个变量,所以我可以在foreach
语句以后使用它?
你应该充分利用IEnumerable
。这样做的美妙之处在于,只有在需要时才会评估您的查询。一旦执行了ToList()
,查询就完全执行了。建议尽量使用IEnumerable
。
你可以在外部作用域中像这样定义IEnumerable<Data>
IEnumerable<Data> myDataList;
using(myObject.......)
{
myDataList =csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) });
}
// do your stuffs
// and just use the IEnumerable<Data> in your foreach loop
foreach(var item in myDataList)
{
// here item is typeof(Data)
}
查询的类型是IEnumerable<Data>
,您可以在using
块之外声明。然而,从注释中可以明显看出,不能枚举myObject
被处理之后的情况。如果不想在离开using
块之前将所有元素拉入列表,那么唯一的选择是在using
块内进行枚举。从数据库中提取数据需要打开到该数据库的连接等。
using(myObject.......)
{
var query = csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) });
//Do some stuff
//Now I want to use the result of the query
foreach (var item in query)
...
}
在using块外声明一个变量
调用ToList()
或ToArray()
执行查询。
List<Data> data=null;
using(myObject.......)
{
data=csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) }).ToList();
}
如果可以在从using
子句返回后执行查询,您可以这样做:
IEnumerable<Data> data=null;
using(myObject.......)
{
data=csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) });
}
但如果是这样的话,为什么要把它放在using
子句中呢?
如果查询依赖于myObject
未被处理,您有两个选择:
- 使用
ToList()
立即执行查询并将其全部加载到内存中。 - 稍后处理
myObject
。