/ / Convert 2 forloops to linq - c #, linq

Konwertuj 2 forloopy na linq - c #, linq

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 № 1

Jak 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.