Czy istnieje sposób na wykonanie poniższych czynności przy użyciu LINQ?
foreach (var c in collection)
{
c.PropertyToSet = value;
}
Aby to wyjaśnić, chcę iterować po każdym obiekcie w kolekcji, a następnie zaktualizować właściwość na każdym obiekcie.
Mój przypadek użycia polega na tym, że mam kilka komentarzy do posta na blogu i chcę iterować każdy komentarz do postu na blogu i ustawić datę i godzinę na blogu na +10 godzin. Mógłbym to zrobić w SQL, ale chcę zachować to w warstwie biznesowej.
Odpowiedzi:
Możesz użyć
ForEach
metody rozszerzenia, ale jeśli chcesz użyć tylko frameworku, możesz to zrobićJest
ToList
to potrzebne do natychmiastowej oceny wyboru ze względu na leniwą ocenę .źródło
ObservableCollection
powiedziano o kolekcji , przydatna może być zmiana pozycji zamiast tworzenia nowej listy.źródło
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 }; });
Robię to
źródło
All()
metody rozszerzenia, co prowadzi do potencjalnych nieporozumień, gdy ktoś inny czyta kod.List<>
,ForEach()
metoda ta jest znacznie mniej tajemnicza. exForEach(c => { c.needsChange = value; })
I rzeczywiście znaleziono metodę rozszerzenia , które będą robić to, co chcę ładnie
źródło
foreach
pętli (z jakiegokolwiek powodu).foreach
ponieważ sam kod zawieraforeach
pętlęPosługiwać się:
Nie jestem pewien, czy to nadużywa LINQ, czy nie, ale zadziałało to, gdy chcę zaktualizować określone elementy na liście dla określonego warunku.
źródło
Nie ma wbudowanej metody rozszerzenia, aby to zrobić. Chociaż zdefiniowanie jednego jest dość proste. Na dole postu znajduje się metoda, którą zdefiniowałem, o nazwie Iterate. Można go tak używać
Iterate Source
źródło
Chociaż konkretnie poprosiłeś o rozwiązanie LINQ, a to pytanie jest dość stare, zamieszczam rozwiązanie inne niż LINQ. Wynika to z tego, że LINQ (= zapytanie zintegrowane w języku ) jest przeznaczone do użycia w zapytaniach dotyczących kolekcji. Wszystkie metody LINQ nie modyfikują podstawowej kolekcji, po prostu zwracają nową (a dokładniej iterator do nowej kolekcji). Zatem cokolwiek robisz np. Z
Select
nie wpływa na kolekcję, po prostu dostajesz nową.Oczywiście możesz to zrobić za pomocą
ForEach
(który nie jest LINQ, ale rozszerzenie jest włączoneList<T>
). Ale i tak dosłownie się to stosujeforeach
, ale z wyrażeniem lambda. Poza tym każda metoda LINQ wewnętrznie iteruje Twoją kolekcję, np. Przy użyciuforeach
lubfor
, ale po prostu ukrywa ją przed klientem. Nie uważam tego za bardziej czytelny ani konserwowalny (pomyśl o edycji kodu podczas debugowania metody zawierającej wyrażenia lambda).Powiedziawszy to, nie powinieneś używać LINQ do modyfikowania przedmiotów w swojej kolekcji. Lepszym sposobem jest rozwiązanie, które już podałeś w swoim pytaniu. Dzięki klasycznej pętli możesz z łatwością iterować swoją kolekcję i aktualizować jej elementy. W rzeczywistości wszystkie te rozwiązania, na których się opierają,
List.ForEach
nie są niczym innym, ale o wiele trudniejsze do odczytania z mojej perspektywy.Dlatego nie powinieneś używać LINQ w przypadkach, w których chcesz zaktualizować elementy swojej kolekcji.
źródło
for
pętlę „pod maską”. Wydaje mi się, że syntaktycznym cukrem jest tworzenie mniej szczegółowych sposobów wykonywania prostych zadań, a nie zastępowanie standardowego kodowania.Wypróbowałem kilka wariantów tego i wracam do rozwiązania tego faceta.
http://www.hookedonlinq.com/UpdateOperator.ashx
Ponownie, jest to czyjeś rozwiązanie. Ale skompilowałem kod do małej biblioteki i używam go dość regularnie.
Wkleję tutaj jego kod, aby nie ryzykować, że jego strona (blog) przestanie istnieć w pewnym momencie w przyszłości. (Nie ma nic gorszego niż wyświetlenie postu z napisem „Oto dokładna odpowiedź, której potrzebujesz”, Kliknięcia i Martwego adresu URL).
źródło
Action<TSource>
zamiast zamiast tworzenia dodatkowego delegata. Jednak może to nie być dostępne w momencie pisania tego.where T: struct
Złapać to w czasie kompilacji.Nie, LINQ nie obsługuje sposobu masowej aktualizacji. Jedynym krótszym sposobem byłoby użycie
ForEach
metody rozszerzenia - Dlaczego w IEnumerable nie ma metody rozszerzenia ForEach?źródło
Napisałem kilka metod rozszerzenia, które mi w tym pomogą.
Używam tego w ten sposób:
Dla porównania: sprawdzenie argumentu:
źródło
Moje 2 grosze: -
źródło
Możesz użyć LINQ, aby przekonwertować swoją kolekcję na tablicę, a następnie wywołać Array.ForEach ():
Oczywiście nie będzie to działać z kolekcjami struktur lub wbudowanymi typami, takimi jak liczby całkowite lub łańcuchy.
źródło
Oto metoda rozszerzenia, której używam ...
źródło
List<T>.ForEach
robi, ale tylko dla wszystkichIEnumerable
.Zakładam, że chcesz zmienić wartości wewnątrz zapytania, aby móc dla niego napisać funkcję
Ale nie martw się, jeśli o to ci chodzi.
źródło
Możesz użyć Magiq , frameworku operacji wsadowych dla LINQ.
źródło
Załóżmy, że mamy dane takie jak poniżej,
a jeśli chcemy zmodyfikować listę i zastąpić istniejące wartości listy zmodyfikowanymi wartościami, najpierw utwórz nową pustą listę, a następnie przejrzyj listę danych, wywołując metodę modyfikacji dla każdego elementu listy,
źródło