Y a-t-il un moyen de faire ce qui suit en utilisant LINQ ?
foreach (var c in collection)
{
c.PropertyToSet = value;
}
Pour clarifier, je veux itérer à travers chaque objet dans une collection et ensuite 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 itérer à travers chaque commentaire sur un article de blog et définir la date de l'article de blog à +10 heures. Je pourrais le faire en SQL, mais je veux que cela reste dans la couche métier.
Il n'existe pas de méthode d'extension intégrée pour ce faire. Cependant, il est assez simple d'en définir une. Au bas de l'article se trouve une méthode que j'ai définie, appelée Iterate. Elle peut être utilisée comme suit
collection.Iterate(c => { c.PropertyToSet = value;} );
Iterate Source
public static void Iterate<T>(this IEnumerable<T> enumerable, Action<T> callback)
{
if (enumerable == null)
{
throw new ArgumentNullException("enumerable");
}
IterateHelper(enumerable, (x, i) => callback(x));
}
public static void Iterate<T>(this IEnumerable<T> enumerable, Action<T,int> callback)
{
if (enumerable == null)
{
throw new ArgumentNullException("enumerable");
}
IterateHelper(enumerable, callback);
}
private static void IterateHelper<T>(this IEnumerable<T> enumerable, Action<T,int> callback)
{
int count = 0;
foreach (var cur in enumerable)
{
callback(cur, count);
count++;
}
}
Non, LINQ ne prend pas en charge une méthode de mise à jour en masse. Le seul moyen plus court serait d'utiliser une méthode d'extension ForEach
- https://stackoverflow.com/questions/101265/why-is-there-not-a-foreach-extension-method-on-the-ienumerable-interface#101303.
Je suppose que vous voulez changer les valeurs à l'intérieur d'une requête, vous pouvez donc écrire une fonction pour cela.
void DoStuff()
{
Func<string, Foo, bool> test = (y, x) => { x.Bar = y; return true; };
List<Foo> mylist = new List<Foo>();
var v = from x in mylist
where test("value", x)
select x;
}
class Foo
{
string Bar { get; set; }
}
Mais je ne suis pas sûr que ce soit ce que vous voulez dire.