Mam funkcję
private void TotalOutcome(List<Prenumerator> prenumerators, List<Publication> publications)
{
foreach (Publication publication in publications)
{
foreach (Prenumerator prenumerator in prenumerators)
{
if (prenumerator.PublicationCode == publication.Code)
{
publication.Earnings += prenumerator.Count * publication.MonthPrice;
}
}
}
}
Jak mogę przekonwertować to na Linq? Moje obecne podejście nie działa, nie robi nic:
publications = (from publication in publications
from prenumerator in prenumerators
where prenumerator.PublicationCode == publication.Code
select publication);
{
publication.Earnings += prenumerator.Count * publication.MonthPrice;
}
);
Odpowiedzi:
2 dla odpowiedzi № 1Jak wspomnieli inni, LINQ nie jest właściwym narzędziem do aktualizacji, ale możesz to zrobić częściowo używając LINQ, np. Dla części obliczeniowej, a następnie użyć zwykłego foreach
pętla dla części aktualizacji, na przykład:
foreach (Publication publication in publications)
{
var total = prenumerators.Where(o => o.PublicationCode == publication.PublicationCode)
.Sum(o => o.Count * publication.MonthPrice);
publication.Earnings += total;
}
1 dla odpowiedzi nr 2
Możesz przekonwertować drugą pętlę w ten sposób
private static void TotalOutcome(List<Prenumerator> prenumerators, List<Publication> publications)
{
foreach (Publication publication in publications)
{
foreach (Prenumerator prenumerator in prenumerators.Where(prenumerator => prenumerator.PublicationCode == publication.Code))
{
publication.Earnings += prenumerator.Count * publication.MonthPrice;
}
}
}
1 dla odpowiedzi nr 3
Po prostu pedantyczny i idź pełną Linq (chybato jest cytat z Forest Gump) To jest "poprawa" na kodzie Har07; jednak w zależności od standardów kodowania w miejscu pracy niektóre miejsca mogą nie lubić tak bezinteresownego korzystania z Linq.
publications.ForEach(publication =>
{
publication.Earnings = prenumerators
.Where(o => o.PublicationCode == publication.PublicationCode)
.Sum(o => o.Count * publication.MonthPrice);
});
W naszym sklepie obowiązuje zasada, że nie wolno Ci jej używać. Jeśli nie, delegat, do którego zamierzasz włożyć, jest dłuższy niż jedna linia.
0 dla odpowiedzi nr 4
Krok pierwszy, stosujemy trochę prawa stowarzyszenia:
var cnt = 0;
foreach (Prenumerator prenumerator in prenumerators)
{
if (prenumerator.PublicationCode == publication.Code)
{
cnt += prenumerator.Count;
}
}
publication.Earnings = cnt * publication.MonthPrice;
Ułatwia to następny krok:
publication.Earnings = prenumerators
.Where(p=>p.PublicationCode == publication.Code)
.Aggregate(p=> p.Count)) * publication.MonthPrice;
Nie ma żadnego szczególnie dobrego sposobu na pozbycie się zewnętrznej pętli.