2010-05-12 3 views
1

Est-il possible de faire la même chose en utilisant LambdaChanger la boucle avec lambda (C# 3.0)

for (int i = 0; i < objEntityCode.Count; i++) 
{ 
    options.Attributes[i] = new EntityCodeKey(); 
    options.Attributes[i].EntityCode = objEntityCode[i].EntityCodes; 
    options.Attributes[i].OrganizationCode = Constants.ORGANIZATION_CODE; 
} 

Je veux dire de réécrire l'instruction à l'aide lambda. J'ai essayé avec

Enumerable.Range(0,objEntityCode.Count-1).Foreach(i=> { 
    options.Attributes[i] = new EntityCodeKey(); 
    options.Attributes[i].EntityCode = objEntityCode[i].EntityCodes; 
    options.Attributes[i].OrganizationCode = Constants.ORGANIZATION_CODE; } 
); 

mais ne fonctionne pas J'utilise C# 3.0

+2

Est-ce _what_ en utilisant un lambda? –

+0

Je veux dire de réécrire l'instruction en utilisant lambda. J'ai essayé avecEnumerable.Range (0, objEntityCode.Count-1) .Foreach (i => {options.Attributes [i] = nouvelle EntityCodeKey(); options.Attributes [i] .EntityCode = objEntityCode [i]. EntityCodes; options.Attributs [i] .OrganizationCode = Constantes.ORGANIZATION_CODE; }); mais ne fonctionne pas – Newbie

+1

Pourquoi voulez-vous le faire en utilisant lambdas? Si votre structure repose sur l'index, alors elle ne se prête pas à une structure List.ForEach(), et FWIW, les boucles font partie intégrante du langage de programmation ... comment cela améliore-t-il votre programme en * ne * les utilisant pas? ? – jeffora

Répondre

7

Eh bien, vous pouvez le rendre plus simple avec initialiseurs d'objets, pour commencer:

for (int i = 0; i < objEntityCode.Count; i++) 
{ 
    options.Attributes[i] = new EntityCodeKey 
    { 
     EntityCode = objEntityCode[i].EntityCodes, 
     OrganizationCode = Constants.ORGANIZATION_CODE 
    }; 
} 

Je laisserais probablement à cela cependant ... il n'y a actuellement aucune méthode d'extension ForEach sur IEnumerable<T> - et pour good reasons, bien que je sache que ce n'est pas une opinion universellement détenue;)

Dans ce cas, vous encore besoin de connaître i afin de mettre options.Attributes[i] - à moins que vous pouvez définir l'ensemble de options.Attributes en une seule fois, bien sûr ... sans savoir sur les types impliqués, il est assez difficile de conseiller davantage.

Si options.Attributes est une propriété inscriptible (par exemple un tableau), vous pouvez utiliser:

options.Attributes = objEntityCode.Select(code => new EntityCodeKey 
    { 
     EntityCode = code.EntityCodes, 
     OrganizationCode = Constants.ORGANIZATION_CODE 
    }).ToArray(); 

Si options.Attributes est en fait juste une propriété qui retourne un type avec un indexeur, qui ne fonctionnera pas.

+0

Monsieur, ce qui est WRNG dans le ci-dessous Enumerable.Range (0, objEntityCode.Count - 1) .Select (i => { options.Attributes [i] = new EntityCodeKey {entitycode = objEntityCode [i] .EntityCodes , OrganizationCode = Constants.ORGANIZATION_CODE}; }). ToArray(); Erreur de lancement Les arguments de type pour la méthode 'System.Linq.Enumerable.Select (System.Collections.Generic.IEnumerable , System.Func )' ne peuvent pas être déduits de l'utilisation. Essayez de spécifier explicitement les arguments de type. – Newbie

+0

Votre expression lambda ne renvoie rien. C'est juste une déclaration. Cela n'aide pas vraiment une projection Select ... L'autre chose qui est "faux" avec ça, c'est qu'elle introduit tout un tas de choses sans raison. LINQ est destiné à rendre le code * plus simple *, pas plus compliqué. –

0
Enumerable.Range(0, objEntityCode.Count - 1).ToList().ForEach(i => 
       { 
        options.Attributes[i] = new EntityCodeKey(); 
        options.Attributes[i].EntityCode = objEntityCode[i].EntityCodes; 
        } 
       ); 
+1

Je vais ajouter le même commentaire que j'ai fait sur votre question: Pourquoi voulez-vous le faire comme ça?Comment est-ce mieux que d'écrire explicitement la boucle? – jeffora

+0

Monsieur, j'apprends LINQ et LAMBDA ... désormais j'essaie d'écrire ces déclarations. :) – Newbie

0
Enumerable.Range(0, objEntityCode.Count - 1).ToList().ForEach(i => 
       { 
        options.Attributes[i] = new EntityCodeKey 
        { 
         EntityCode = objEntityCode[i].EntityCodes 
         , OrganizationCode = Constants.ORGANIZATION_CODE 
        }; 

       } 
      );