/ / Convierta 2 bucles en linq - c #, linq

Convierta 2 bucles a linq - c #, linq

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

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