声明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< T>变量以供以后使用

你应该充分利用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