2013-05-08 19 views
0

我從MSDN sample以下代碼:Enumerable如何轉換爲字典?

if (sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0) 
{ 
    row = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).First(); 
... 

哪我重構如下:

Dictionary<uint, Row> rowDic = sheetData.Elements<Row>().ToDictionary(r => r.RowIndex.Value); 
if (rowDic[rowIndex].Count() != 0) 
{ 
    row = rowDic[rowIndex]; 
... 

現在,我感測到的是,如果Enumerable.ToDictionary <>方法實際上具有枚舉通過所有的數據,那麼這將是多餘的,但MSDN文檔沒有說明這個轉換是如何發生的。

我想使用的另一種方法是:

var foundRow = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex); 
if (foundRow.Count() != 0) 
{ 
    row = foundRow.First(); 
... 

不過,我想可能從以往的經驗,這將是更快,爲什麼就知道了。

謝謝。

+0

*什麼*是多餘的?真的不清楚你在問什麼。但'ToDictionary' *不會*熱切地在整個輸入序列中迭代。 – 2013-05-08 13:48:19

+0

如果你想知道哪兩件事情更快,那麼**運行它們**,你很快就會知道。 – 2013-05-08 15:01:48

回答

5

的更清潔的替代是:

var row = sheetData.Elements<Row>() 
        .FirstOrDefault(r => r.RowIndex == rowIndex); 
if (row != null) 
{ 
    // Use row 
} 

這隻會通過序列重複一次,而且會盡快找到一個匹配停止。

+1

冗餘.Where子句。 Lambda可以移動到.FirstOrDefault。例如'.FirstOrDefault(r => r.RowIndex == rowIndex);' – spender 2013-05-08 13:51:59

+0

@spender:對 - 我總是忘記這一點。 (同上伯爵)。很好的接收。 – 2013-05-08 13:55:09

+0

相同。 Resharper通常救我。 – spender 2013-05-08 14:00:33

1

.Count()ToDictionary方法都必須枚舉所有元素以獲得結果。

這裏是最有效的實現:

var foundRow = sheetData.Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex); 
if (foundRow != null) 
{ 
    row = foundRow; 

...