2013-07-26 72 views
2

我以爲我會很聰明,寫這樣的代碼示例。這似乎是一種乾淨而有效的方式來填充一個數組而不用第二次枚舉。投影:一次填充2個陣列

int i = 0; 
var tickers = new List<string>(); 
var resultTable = results.Select(result => new Company 
{ 
     Ticker = tickers[i++] = result.CompanyTicker, 
}); 

我真的不在乎另一種方式來做到這一點,因爲我明顯可以用for循環完成這個任務。我更感興趣爲什麼這段代碼不起作用,即代碼運行後tickers.Count = 0,儘管有100多個結果。誰能告訴我爲什麼我會得到這種意想不到的行爲?

+0

這行看起來奇怪:北京時間=行情[我++] = result.CompanyTicker, – frenchie

+0

它** **應該扔某處出現異常... –

+0

@frenchie它將result.CompanyTicker賦值給'tickers [i ++]'和'Ticker'。 –

回答

8

您需要迭代查詢,例如在末尾使用.ToArray()ToList()。目前您剛剛創建了一個查詢,它尚未執行呢,尚未執行

您可能會看到:LINQ and Deferred Execution

另外,我相信你的代碼應該拋出一個異常,爲IndexOutOfRange,因爲你的名單沒有任何項目。

2

這是由於LINQ的懶惰執行。當查詢得到執行時(即當你迭代它時),該列表應該有你的結果。一個簡單的方法是使用ToArrayToList

+0

即使您觸發執行後,此代碼也會因IndexOutOfRangeException – Odrade

1

Linq理想情況下應該沒有副作用。

我看不出有什麼會阻止這是一個兩步的過程:

var tickers = results.Select(r => r.CompanyTicker).ToList(); 

var resultTable = tickers.Select(t => new Company { Ticker = t }).ToList();