我有一个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
语句中使用它?
答案 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
。