Remplacement de foreach imbriqué avec LINQ; modifier et mettre à jour une propriété au plus profond de
Prendre en considération le besoin de changement un membre de données sur une ou plusieurs propriétés d'un objet qui est de 5 ou 6 niveaux de profondeur.
Il y a des sous-collections qui doivent être répétées pour arriver à la propriété qui doit inspection & modification.
Ici nous sommes à l'appel d'une méthode qui nettoie l'adresse d'un Employé. Depuis que nous sommes en train de changer les données à l'intérieur de la boucle, la mise en œuvre actuelle a besoin d'un for
de la boucle pour éviter que l'exception:
Ne peut pas attribuer à "someVariable" parce que c'est un "foreach variable d'itération'
Voici l'algorithme actuel (crypté) avec imbriqué foreach
et un for
.
foreach (var emp in company.internalData.Emps)
{
foreach (var addr in emp.privateData.Addresses)
{
int numberAddresses = addr.Items.Length;
for (int i = 0; i < numberAddresses; i++)
{
//transform this street address via a static method
if (addr.Items[i].Type =="StreetAddress")
addr.Items[i].Text = CleanStreetAddressLine(addr.Items[i].Text);
}
}
}
Question:
Cet algorithme peut être réimplémentée à l'aide de LINQ? L'exigence est pour l'original de la collecte de ses données modifiées par la méthode statique appel.
Mise à jour: je pensais/se penchant dans la direction d'un jQuery/sélecteur de type de solution. Je n'ai pas spécialement mot à cette question de cette façon. Je me rends compte que j'étais plus portée sur cette idée (sans effets secondaires). Merci à tout le monde! Si il ya une telle façon d'effectuer un jQuery-comme sélecteur, veuillez nous allons voir ça!
source d'informationauteur p.campbell
Vous devez vous connecter pour publier un commentaire.
LINQ n'est pas prévu de modifier des ensembles d'objets. Vous ne seriez pas s'attendre à une instruction SELECT sql pour modifier les valeurs des lignes sélectionnées, voulez-vous? Il aide à se rappeler ce que LINQ l'abréviation de la Langue Naturelle Intégrée Requête. Modification des objets dans une requête linq est, à mon humble avis, un anti-modèle.
Stan R. la réponse serait une meilleure solution à l'aide d'un foreach boucle, je pense.
Je n'aime pas le mélange de la requête "compréhension" de la syntaxe et de pointillés-méthode-la syntaxe d'appel dans la même instruction.
J'aime l'idée de séparer les requête de la action. Ils sont sémantiquement distinctes, de sorte que les séparant dans le code est souvent judicieux.
Un peu le style des notes au sujet de votre code; elles sont personnelles, donc je vous ne pouvez pas d'accord:
Emps
emp
addr
)addr
vsAddresses
): choisissez-en un et de rester avec elletype
champ être une chaîne de caractères est une odeur de code. Si vous pouvez en faire uneenum
votre code sera probablement mieux.Sale one-liner.
LINQ n'offre pas la possibilité d'avoir des effets secondaires. cependant, vous pouvez faire:
Vous pouvez le faire, mais vous ne voulez pas vraiment. Plusieurs blogueurs ont parlé de la nature fonctionnelle de Linq, et si vous regardez tous les MS fourni des méthodes Linq, vous trouverez qu'ils ne produisent pas d'effets secondaires. Ils produisent des valeurs de retour, mais ils n'ont pas changer quoi que ce soit d'autre. Recherche pour les arguments sur une Linq ForEach méthode, et vous aurez une bonne explication de ce concept.
Avec cela à l'esprit, ce que vous probaly voulez, c'est quelque chose comme ceci:
Toutefois, si vous ne voulez faire exactement ce que vous avez demandé, alors que c'est la direction que vous devez aller:
Pour mettre à jour le LINQ résultat à l'aide d'une boucle FOREACH, j'ai d'abord créer local "liste" variable et puis effectuer la mise à jour à l'aide de Boucle FOREACH. La valeur sont mis à jour de cette façon. Lire la suite ici:
Comment mettre à jour la valeur de LINQ résultats à l'aide d'une boucle FOREACH