2010-10-05 16 views

Répondre

1

L'idée originale de LINQ est de ne pas modifier les collections existantes, mais Renvoyer de nouveaux, donc des méthodes comme ForEach ne font pas partie des méthodes LINQ par défaut.

Vous pouvez facilement écrire votre propre ForEach comme:

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

et donc votre code deviendrait:

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

BTW ...
il est vraiment écrit utile comme LINQ extension, quand avec 2 lignes de code ancien impératif-école vous pouvez faire la même chose?

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

Entièrement d'accord avec digEmAll! Voici le post (http://blogs.msdn.com/b/ericwhite/archive/2009/04/08/why-i-don-t-use-the-foreach-extension-method.aspx) qui explique la raison de absence de ForEach. – VinayC

+0

Thx pour la réponse avec l'apport de très bonnes connaissances pour me faire reconnaître mon domaine de travail avec les méthodes d'extension. Je prendrais soin de ces points. Mais je suis un apprenant à Linq, donc je continuerais à l'utiliser pendant quelques mois jusqu'à ce que j'aie une connaissance complète à ce sujet. Je n'ai jamais utilisé IQueryable alors j'essayais de l'explorer. –

+0

OK, pour les différences IQueryable et IEnumerable, voir par exemple: http://stackoverflow.com/questions/252785/what-is-the-difference-between-iqueryablet-and-ienumerablet et http://stackoverflow.com/questions/ 2433306/whats-the-difference-between-iqueryable-and-ienumerable – digEmAll

1

méthode ForEach n'est pas mis en œuvre ni dans DataGridViewColumnCollection ni dans l'interface IQueryable. Here est le post à ce sujet sur le blog d'Eric Lippert.
Si vous avez besoin de cette fonctionnalité, vous pouvez facilement implémenter la méthode d'extension

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

Et puis utilisez:

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

Mais, je pense, il est beaucoup plus facile juste pour itérer jeter les colonnes.

foreach (var column in dgv.Columns) 
    column.ReadOnly = true;