Tengo la función
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;
}
}
}
}
¿Cómo puedo convertir esto a linq? Mi enfoque actual no funciona, no hace nada:
publications = (from publication in publications
from prenumerator in prenumerators
where prenumerator.PublicationCode == publication.Code
select publication);
{
publication.Earnings += prenumerator.Count * publication.MonthPrice;
}
);
Respuestas
2 para la respuesta № 1Como han mencionado otros, LINQ no es la herramienta adecuada para la operación de actualización. Todavía puedes hacer esto parcialmente usando LINQ, es decir, para la parte de cálculo, y luego usar plain foreach
bucle para la parte de actualización, por ejemplo:
foreach (Publication publication in publications)
{
var total = prenumerators.Where(o => o.PublicationCode == publication.PublicationCode)
.Sum(o => o.Count * publication.MonthPrice);
publication.Earnings += total;
}
1 para la respuesta № 2
Puedes convertir el 2º ciclo como este
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 para la respuesta № 3
Solo para ser pedante y completar Linq (creoesa es la cita de Forest Gump). Esta es una "mejora" en el código de har07; sin embargo, dependiendo de los estándares de codificación en los que trabaje, es posible que a algunos lugares no les guste este uso gratuito de Linq.
publications.ForEach(publication =>
{
publication.Earnings = prenumerators
.Where(o => o.PublicationCode == publication.PublicationCode)
.Sum(o => o.Count * publication.MonthPrice);
});
En realidad, tenemos una regla en nuestra tienda que no se le permite usar .ForEach si el delegado que va a colocar es más largo que una línea.
0 para la respuesta № 4
El primer paso, aplicamos un poco de la ley de asociación:
var cnt = 0;
foreach (Prenumerator prenumerator in prenumerators)
{
if (prenumerator.PublicationCode == publication.Code)
{
cnt += prenumerator.Count;
}
}
publication.Earnings = cnt * publication.MonthPrice;
Esto facilita el siguiente paso:
publication.Earnings = prenumerators
.Where(p=>p.PublicationCode == publication.Code)
.Aggregate(p=> p.Count)) * publication.MonthPrice;
No hay una manera particularmente buena de deshacerse del bucle externo.