Υπάρχει τρόπος να γίνει το εξής με τη χρήση του LINQ;
foreach (var c in collection)
{
c.PropertyToSet = value;
}
Για να διευκρινίσω, θέλω να κάνω επανάληψη σε κάθε αντικείμενο μιας συλλογής και στη συνέχεια να ενημερώσω μια ιδιότητα σε κάθε αντικείμενο.
Η περίπτωση χρήσης μου είναι ότι έχω ένα σωρό σχόλια σε μια δημοσίευση ιστολογίου, και θέλω να επαναλάβω κάθε σχόλιο σε μια δημοσίευση ιστολογίου και να ορίσω το datetime της δημοσίευσης ιστολογίου να είναι +10 ώρες. Θα μπορούσα να το κάνω σε SQL, αλλά θέλω να το κρατήσω στο επιχειρησιακό επίπεδο.
Δεν υπάρχει ενσωματωμένη μέθοδος επέκτασης για να γίνει αυτό. Παρόλο που ο ορισμός μιας τέτοιας μεθόδου είναι αρκετά εύκολος. Στο κάτω μέρος της ανάρτησης υπάρχει μια μέθοδος που όρισα και ονομάζεται Iterate. Μπορεί να χρησιμοποιηθεί ως εξής
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++;
}
}
Όχι, το LINQ δεν υποστηρίζει έναν τρόπο μαζικής ενημέρωσης. Ο μόνος πιο σύντομος τρόπος θα ήταν να χρησιμοποιήσετε μια μέθοδο επέκτασης ForEach
- https://stackoverflow.com/questions/101265/why-is-there-not-a-foreach-extension-method-on-the-ienumerable-interface#101303
Υποθέτω ότι θέλετε να αλλάξετε τις τιμές μέσα σε ένα ερώτημα, οπότε θα μπορούσατε να γράψετε μια συνάρτηση γι' αυτό
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; }
}
Αλλά δεν είμαι σίγουρος αν αυτό εννοείτε.