2011-11-10 10 views
2

我有一個LINQ查詢,例如:聲明中使用的IEnumerable <T>變量以後

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

我認爲一旦myObject的設置在查詢不工作了。是對的嗎? – CodesInChaos

+0

這似乎是問題所在。哦,臉掌! DOH! DOH! DOH! – Jon

回答

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) 
    ... 
} 
+0

我初步嘗試之前,我問,但沒有什麼變量 – Jon

+0

我認爲你需要做一個.ToList()來執行查詢。 –

+0

@Jon:當你說變量中什麼都沒有時,你的意思是它是空的,還是隻是一個空的IEnumerable? – StriplingWarrior

2

在使用塊之外聲明一個變量。

致電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
+0

調用ToList()是否具有與foreach相同的性能?我問的原因是因爲IEnumerable 有6-8百萬個項目 – Jon

+0

列表將加載所有項目到內存中。 – CodesInChaos

+0

但是foreach不會?我無法記住這麼多! – Jon

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) 
}