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

Premeniť 2 forloops na linq - c #, linq

Mám funkciu

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;
}
}
}
}

Ako môžem previesť na linq? Môj súčasný prístup nefunguje, nič nerobí:

publications = (from publication in publications
from prenumerator in prenumerators
where prenumerator.PublicationCode == publication.Code
select publication);
{
publication.Earnings += prenumerator.Count * publication.MonthPrice;

}
);

odpovede:

2 pre odpoveď č. 1

Ako už uviedli ostatní, LINQ nie je správnym nástrojom pre aktualizáciu.Môžete to ešte urobiť čiastočne pomocou LINQ, tj pre výpočtovú časť a potom použite jednoduchý foreach slučka pre aktualizačnú časť, napríklad:

foreach (Publication publication in publications)
{
var total = prenumerators.Where(o => o.PublicationCode == publication.PublicationCode)
.Sum(o => o.Count * publication.MonthPrice);
publication.Earnings += total;
}

1 pre odpoveď č. 2

Druhou slučku môžete konvertovať takto

  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 pre odpoveď č. 3

Len aby som bol pedantský a ísť plný Linq (myslímto je citát od Forest Gump) Toto je "zlepšenie" na kóde har07; avšak v závislosti od vašich štandardov kódovania, kde pracujete, niektoré miesta sa nemusia páčiť toľko bezplatného používania Linq.

publications.ForEach(publication =>
{
publication.Earnings = prenumerators
.Where(o => o.PublicationCode == publication.PublicationCode)
.Sum(o => o.Count * publication.MonthPrice);
});

Vlastne máme v našom obchode pravidlo, ktoré nesmiete používať. Pretože delegát, ktorého sa chystáte vložiť, je dlhší ako jeden riadok.


0 pre odpoveď č. 4

V prvom kroku aplikujeme trochu zákona o združení:

         var cnt = 0;
foreach (Prenumerator prenumerator in prenumerators)
{
if (prenumerator.PublicationCode == publication.Code)
{
cnt += prenumerator.Count;
}
}
publication.Earnings = cnt * publication.MonthPrice;

To uľahčuje ďalší krok:

publication.Earnings = prenumerators
.Where(p=>p.PublicationCode == publication.Code)
.Aggregate(p=> p.Count)) * publication.MonthPrice;

Neexistuje žiadny zvlášť dobrý spôsob, ako sa zbaviť vonkajšej slučky.