2010-10-05 51 views

回答

1

LINQ的最初的想法是不修改現有集合,但返回新的,所以像ForEach這樣的方法不在默認的LINQ方法之中。

您就可以輕鬆編寫自己的ForEach,如:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) 
{ 
    foreach (var item in source) 
     action(item); 
} 

,因此您的代碼將變成:

dgv.Columns.Cast<DataGridViewColumn>.ForEach(col=>col.ReadOnly=true); 

BTW ...
實在是值得書寫它作爲LINQ擴展,當有兩行舊的命令式學校代碼時,你可以做同樣的事情嗎?

foreach (DataGridViewColumn col in this.dataGridView1.Columns) 
    col.ReadOnly = true; 
+0

完全同意digEmAll!這是帖子(http://blogs.msdn.com/b/ericwhite/archive/2009/04/08/why-i-don-t-use-the-foreach-extension-method.aspx),它解釋了原因缺少ForEach。 – VinayC 2010-10-05 09:24:05

+0

Thx迴應帶來非常好的知識,使我認識到我的擴展方法的工作領域。我會照顧這些問題。但我是Linq的學習者,所以我會繼續使用它幾個月,直到我獲得完整的知識。我從來沒有使用IQueryable,所以我試圖去探索它。 – 2010-10-06 01:44:43

+0

好的,對於IQueryable和IEnumerable的區別請參閱例如:http://stackoverflow.com/questions/252785/what-is-the-difference-between-iqueryablet-and-ienumerablet和http://stackoverflow.com/questions/ 2433306 /最新最差間的IQueryable和 - IEnumerable的 – digEmAll 2010-10-06 06:55:40

1

ForEach方法既未在DataGridViewColumnCollection中也未在IQueryable接口中實現。 Here是來自Eric Lippert博客的文章。
如果需要此功能,您可以輕鬆實現擴展方法

public static void ForEach(this DataGridViewColumnCollection cols, Action<DataGridViewColumn> action) 
    { 
     foreach (DataGridViewColumn col in cols) 
     { 
      action(col); 
     } 
    } 

,然後使用它:

dgv.Columns.ForEach(col => col.ReadOnly = true); 

但是,我認爲,它更容易只是重複扔列。

foreach (var column in dgv.Columns) 
    column.ReadOnly = true; 
相關問題