声明IEnumerable <t>变量,以便稍后在</t>上使用

时间:2011-11-10 15:25:41

标签: c# .net linq c#-4.0

我有一个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 ??)
{

}

查询在我的using语句中返回IEnumerable,但是如何声明然后分配变量以便稍后在foreach语句中使用它?

3 个答案:

答案 0 :(得分:3)

查询的类型为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)
    ...
} 

答案 1 :(得分:3)

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

答案 2 :(得分:2)

在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