Existe-t-il un moyen d'effectuer les opérations suivantes à l'aide de LINQ?
foreach (var c in collection)
{
c.PropertyToSet = value;
}
Pour clarifier, je veux parcourir chaque objet d'une collection, puis mettre à jour une propriété sur chaque objet.
Mon cas d'utilisation est que j'ai un tas de commentaires sur un article de blog, et je veux parcourir chaque commentaire sur un article de blog et définir la date / heure sur l'article de blog à +10 heures. Je pourrais le faire en SQL, mais je veux le garder dans la couche métier.
Réponses:
Bien que vous puissiez utiliser une
ForEach
méthode d'extension, si vous souhaitez utiliser uniquement le framework, vous pouvez le faireLe
ToList
est nécessaire pour évaluer la sélection immédiatement en raison d'une évaluation paresseuse .la source
ObservableCollection
mot à dire, il peut être utile de modifier les éléments en place plutôt que de créer une nouvelle liste.la source
collection.ToList().ForEach(c => { c.Property1ToSet = value1; c.Property2ToSet = value2; });
collection.ToList().ForEach(c => { collection[collection.IndexOf(c)] = new <struct type>() { <propertyToSet> = value, <propertyToRetain> = c.Property2Retain }; });
Je fais ça
la source
All()
méthode d'extension, conduisant à une confusion potentielle lorsque quelqu'un d'autre lit le code.List<>
celle-ci, laForEach()
méthode est un moyen beaucoup moins cryptique pour y parvenir. exForEach(c => { c.needsChange = value; })
J'ai trouvé une méthode d'extension qui fera ce que je veux bien
la source
foreach
boucle (pour une raison quelconque).foreach
car le code lui-même contient laforeach
boucleUtilisation:
Je ne sais pas si cela utilise trop LINQ ou non, mais cela a fonctionné pour moi lorsque je voulais mettre à jour un élément spécifique de la liste pour une condition spécifique.
la source
Il n'y a pas de méthode d'extension intégrée pour ce faire. Bien que la définition de l'un soit assez simple. Au bas du message, il y a une méthode que j'ai définie appelée Iterate. Il peut être utilisé comme tel
Itérer la source
la source
Bien que vous ayez spécifiquement demandé une solution LINQ et que cette question soit assez ancienne, je poste une solution non LINQ. En effet, LINQ (= requête intégrée de langue ) est destiné à être utilisé pour les requêtes sur les collections. Toutes les méthodes LINQ ne modifient pas la collection sous-jacente, elles en renvoient juste une nouvelle (ou plus précisément un itérateur dans une nouvelle collection). Ainsi, quoi que vous fassiez par exemple avec un
Select
n'affecte pas la collection sous-jacente, vous en obtenez simplement une nouvelle.Bien sûr toi pouvez le faire avec un
ForEach
(qui n'est pas LINQ, soit dit en passant, mais une extension activéeList<T>
). Mais cela utilise littéralement deforeach
toute façon, mais avec une expression lambda. En dehors de cela, chaque méthode LINQ itère en interne votre collection, par exemple en utilisantforeach
oufor
, mais elle la cache simplement au client. Je ne considère pas cela plus lisible ni maintenable (pensez à éditer votre code tout en déboguant une méthode contenant des expressions lambda).Cela dit, cela ne devrait pas utiliser LINQ pour modifier les éléments de votre collection. Une meilleure façon est la solution que vous avez déjà fournie dans votre question. Avec une boucle classique, vous pouvez facilement itérer votre collection et mettre à jour ses articles. En fait, toutes ces solutions qui
List.ForEach
comptent ne sont pas différentes, mais beaucoup plus difficiles à lire de mon point de vue.Vous ne devez donc pas utiliser LINQ dans les cas où vous souhaitez mettre jour les éléments de votre collection.
la source
for
boucle "sous le capot". Je pense que c'est du sucre syntaxique de créer des façons moins verbeuses de faire des tâches simples, et non de remplacer le codage standard.J'ai essayé quelques variantes à ce sujet, et je reviens toujours à la solution de ce type.
http://www.hookedonlinq.com/UpdateOperator.ashx
Encore une fois, c'est la solution de quelqu'un d'autre. Mais j'ai compilé le code dans une petite bibliothèque et je l'utilise assez régulièrement.
Je vais coller son code ici, pour la chance que son site (blog) cesse d'exister à un moment donné dans le futur. (Il n'y a rien de pire que de voir un article qui dit "Voici la réponse exacte dont vous avez besoin", Click et URL morte.)
la source
Action<TSource>
au lieu de créer un délégué supplémentaire. Cela n'était peut-être pas disponible au moment de la rédaction de cela, cependant.where T: struct
-à- dire de l'attraper au moment de la compilation.Non, LINQ ne prend pas en charge une méthode de mise à jour en masse. Le seul moyen plus court serait d'utiliser une
ForEach
méthode d'extension - Pourquoi n'y a-t-il pas de méthode d'extension ForEach sur IEnumerable?la source
J'ai écrit quelques méthodes d'extension pour m'aider.
Je l'utilise comme ceci:
Pour référence, la vérification des arguments:
la source
Mes 2 centimes: -
la source
Vous pouvez utiliser LINQ pour convertir votre collection en un tableau, puis appeler Array.ForEach ():
Évidemment, cela ne fonctionnera pas avec des collections de structures ou de types intégrés comme des entiers ou des chaînes.
la source
Voici la méthode d'extension que j'utilise ...
la source
List<T>.ForEach
aussi, mais juste pour tousIEnumerable
.Je suppose que vous souhaitez modifier les valeurs dans une requête afin que vous puissiez écrire une fonction pour elle
Mais ne vous inquiétez pas si c'est ce que vous voulez dire.
la source
Vous pouvez utiliser Magiq , un framework d'opérations par lots pour LINQ.
la source
Supposons que nous ayons des données comme ci-dessous,
et si nous voulons modifier la liste et remplacer les valeurs existantes de la liste par des valeurs modifiées, créer d'abord une nouvelle liste vide, puis parcourir la liste de données en appelant la méthode de modification sur chaque élément de la liste,
la source