2010-10-28 54 views
1

這不起作用。爲什麼我必須調用DataGridViewRow上的Cast <>擴展方法?

var result = 
    from row in grid.Rows 
    where (string) row.Cells["COLUMN_1"].Value == "Test" 
    select row.Cells["COLUMN_2"].Value as int?; 

但是這樣做。

var result = 
    from row in grid.Rows.Cast<DataGridViewRow>() 
    where (string) row.Cells["COLUMN_1"].Value == "Test" 
    select row.Cells["COLUMN_2"].Value as int?; 

據我所知,DataGridViewRowCollection是DataGridViewRows的集合。那麼,爲什麼我必須先將每個成員轉換爲DataGridViewRow才能訪問其屬性?

它與DataGridViewRowCollection實現非泛型IEnumerable而不是通用版本IEnumerable<DataGridViewRow>的事實有什麼關係?或者它顯然在內部使用ArrayList?這不會導致我有任何實際問題,但我想更好地理解它。

回答

6

是的,這正是因爲它所宣傳的界面。幾乎LINQ中的所有擴展方法都在IEnumerable<T>上工作,而不是IEnumerableCast<>是彌合這一差距的一種方式 - OfType<>是另一種。

然而,有叫Cast<T>的一個更簡單的方法 - 只要明確鍵入範圍變量:

var result = 
    from DataGridViewRow row in grid.Rows 
    where (string) row.Cells["COLUMN_1"].Value == "Test" 
    select row.Cells["COLUMN_2"].Value as int?; 

編譯器變成完全相同的代碼作爲你的第二個樣品此。

相關問題