Eficiencia de Linq anidado foreach bucles -- # campo con .net campo con linq camp codereview Relacionados El problema

Efficiency of nested LINQ foreach loops


4
vote

problema

Español

He estado trabajando en un proyecto más antiguo con Framework es 3.5 como el objetivo. Hay un nuevo control de usuario que muestra una lista de datos de un servicio web. Presiono el servicio web (SOAP / XML) y deserialice los datos en una lista de un modelo / clase personalizado (esto está en una clase de ayuda fuera del control de usuario).

Detrás en el código de control de usuario detrás, estoy en bucle a través de los datos y lo muestra usando un array = [a*2, b, c*2, d, e*2, f, g*2, h, i*2] 1 . Aquí hay un ejemplo de algunos del Código (Simplificado):

  array = [a*2, b, c*2, d, e*2, f, g*2, h, i*2] 2  

El Markup HTML es un diseño que ya estaba en su lugar en otro lugar, así que elegí no cambiarlo en absoluto en interés del tiempo.

¿Hay una forma más eficiente de bucle a través de las clases / datos de los que podría beneficiarme? Actualmente no veo problemas de velocidad, pero quiero asegurarme de que estoy usando una técnica adecuada.

Original en ingles

I've been working on an older project with framework is 3.5 as the target. There is a new user control that displays a list of data from a web service. I hit the web service (Soap/XML) and deserialize the data into a list of a custom model/class (this is in a helper class outside the user control).

Back in the user control code behind, I'm looping through the data and displaying it using a HtmlTextWriter. Here is an example of some of the code (simplified):

        var sb = new StringBuilder();         using (var writer = new HtmlTextWriter(new StringWriter(sb)))         {             foreach  (                 var month in                     courses.SelectMany(x => x.Offerings)                         .Where(x => !string.IsNullOrEmpty(x.StartDate))                         .Select(x => DateTime.Parse(x.StartDate))                         .Select(x => new DateTime(x.Year, x.Month, 1))                         .Distinct()                         .OrderBy(x => x.Year)                         .ThenBy(x => x.Month)                         .ToList())             {              //some display code using the writer                  foreach (var offering in                     courses.SelectMany(x => x.Offerings)                         .Where(x => !string.IsNullOrEmpty(x.StartDate))                         .Where(                             x =>                                 DateTime.Parse(x.StartDate).Year == month.Year                                 && DateTime.Parse(x.StartDate).Month == month.Month)                         .OrderBy(x => DateTime.Parse(x.StartDate))                         .ToList())                 {                     //more display code using the writer                 }             }         }         thisisadiv.InnerHtml = sb.ToString(); 

The HTML markup is a design that was already in place somewhere else so I chose not to change it at all in the interest of time.

Is there a more efficient way of looping through the classes/data that I could benefit from? I'm currently not seeing any speed issues but want to make sure I'm using an adequate technique.

        

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

Realmente revisando su pregunta. Parece que lo que está tratando de hacer es agrupar todas las ofertas en el mismo año y mes y luego iterar sobre cada oferta. Por lo tanto, una consulta template<typename BidirectionalIterator, typename Compare=StdEqual<BidirectionalIterator>> bool is_palindrome(BidirectionalIterator first, BidirectionalIterator last, Compare comp=Compare()) 3 es probablemente lo que desea:

  template<typename BidirectionalIterator,          typename Compare=StdEqual<BidirectionalIterator>> bool is_palindrome(BidirectionalIterator first,                    BidirectionalIterator last,                     Compare               comp=Compare()) 4  

No estoy seguro de si hay una forma efectiva de una buena etapa de evitar el análisis doble.

 

Actually reviewing your question again it looks like what you are trying to do is to group all offerings by the same year and month and then iterate over each offering. Hence a GroupBy query is probably what you want:

foreach (     var offerings in         courses.SelectMany(x => x.Offerings)             .Where(x => !string.IsNullOrEmpty(x.StartDate))             .Select(x =>                     new {                         Offer = x,                         StartDateMonth = new DateTime(DateTime.Parse(x.StartDate).Year, DateTime.Parse(x.StartDate).Month, 1)                     })             .GroupBy(x => x.StartDateMonth)             .OrderBy(g => g.Key)) {      //some display code using the writer     // offerings will be a group of offerings which have the StartDate in the same year/month      foreach (var offering in offerings.Select(o => o.Offer))     {         // iterate over all offers in the group     } } 

Not sure if there is a nice effective way to avoid the double parsing.

 
 
         
         

Relacionados problema

7  Versión LINQ del algoritmo de recocido simulado  ( Linq version of the simulated annealing algorithm ) 
Decidí intentarlo e implementar (una versión de) la recocido simulado algoritmo usando solo linq , solo para ver si pudiera. Me encantaría si alguien pudi...

2  Obtén el primer patrimonio dado por los días de semana y un tiempo de inicio  ( Get first datetime by given weekdays and a starttime ) 
En el trabajo hay un sistema de entrada donde los clientes pueden especificar los días de semana y una hora de inicio para un evento. Los días de semana son e...

5  Consulta de grupo LINQ - Simplificando  ( Linq group query simplifying ) 
¿Hay alguna forma de escribir esta consulta de trabajo correctamente de manera más eficiente? Solo estoy pidiendo aprender mejor linq: n0 ...

81  Sundokusharp Solver con características avanzadas  ( Sudokusharp solver with advanced features ) 
Aunque es la primera vez que escribo algo "grande", se siente como si conozco C # bastante bien (es muy similar a Java después de todo). Ha sido bueno aprende...

5  Cachill genérico IEnumerable <T>  ( Generic cached ienumerablet ) 
Tengo una fuente 9988776655544330 que lleva tiempo para generar cada elemento. Una vez que se genera un artículo, quiero cambiarlo para evitar la recompensa...

5  Código conciso para realizar la acción en cada elemento, cuando necesita índice  ( Concise code to perform action on every element when need index ) 
Cuando leí esta respuesta , que tiene código: linqObject.Where((obj, index) => { DoWork(obj, index); return true; }).ToArray(); //MUST CALL ToArray() ...

4  Paginado IEnumerable <T> secuencia  ( Paginate ienumerablet sequence ) 
Usé lo siguiente para dividir la secuencia en lotes: source .Select((item, index) => new {Item = item, Index = index}) .ToLookup(x => x.Index / bat...

3  Insertar y actualizar el registro utilizando LINQ llamando a una función común  ( Inserting and updating record using linq by calling a common function ) 
Tengo una función llamada InserUpdateRecords(int flag) a la que paso la variable entera que indica el tipo de operación que tiene que realizar, si 99887776...

6  Uso de LINQ para realizar una únete al exterior de la izquierda en 2 datos de datos (criterios múltiples)  ( Using linq to perform a left outer join in 2 datatables multiples criteria ) 
Sé que existe muchas soluciones sobre cómo crear un OUTER JOIN entre dos DataTables . He creado el siguiente código en C #: DataTable vDT1 = new DataT...

6  Tomar n elementos de la lista de listas  ( Take n elements from list of lists ) 
He venido con una solución súper complicada por un requisito simple. Creo que podría resolver el problema usando LINQ, pero no lo estoy viendo tan claramente....




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos