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ď č. 1Ako 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.