Big Switch Declaración para clasificar una tabla -- # camp codereview Relacionados El problema

Big switch statement for sorting a table


3
vote

problema

Español

Tengo una página web con una tabla. La tabla, con 10 columnas, puede ser ordenada por cada columna ascendente o descendente.

En este momento, controlo el pedido por gran interruptor:

  Func<IQueryable<DeviceUsage>, IOrderedQueryable<DeviceUsage>> orderBy;         IOrderedEnumerable<DeviceUsage> info;         switch (sortOrder)         {             case "user":                 ViewBag.sortableBy = sortOrder;                 info = unitOfWork.deviceUsageRepository.Get(where, null, null, d => d.DeviceInstance, d => d.Storage, d => d.User).OrderBy(s => s.User.FullName);                 ViewBag.Desc = true;                 return PartialView(info.ToPagedList(pageNumber, 15));             case "userDesc":                 ViewBag.sortableBy = sortOrder;                 info = unitOfWork.deviceUsageRepository.Get(where, null, null, d => d.DeviceInstance, d => d.Storage, d => d.User).OrderByDescending(s => s.User.FullName);                 ViewBag.Desc = true;                 return PartialView(info.ToPagedList(pageNumber, 15));             case "manufacturer":                 ViewBag.sortableBy = sortOrder;                 orderBy = q => q.OrderBy(o => o.DeviceInstance.Device.Manufacturer1.Name);                 break;             case "manufacturerDesc":                 ViewBag.sortableBy = sortOrder;                 orderBy = q => q.OrderByDescending(o => o.DeviceInstance.Device.Manufacturer1.Name);                 break;             .             .             .             default:                 ViewBag.sortableBy="";                 orderBy=q => q.OrderBy(o => o.DeviceInstance.Device.CatalogNo);                 break;         }   

Este código funciona pero no parece agradable. Creo que es el interruptor más largo que he escrito. ¿Puede ser mejorado de alguna manera o dejarlo como es?

Explicación Por qué hay diferencia en la lógica:

Como puede ver en user Estoy clasificando por Fullname que no está en DB (su creado localmente en DAL de Name & Amp; apellido). @ Nick's Enfoque está bien, pero agregar un nuevo 9988777766655443333 es un poco problemático porque solo hay la posibilidad de ordenar por 9988776665544334 fila a la vez. Así que necesitaría almacenarlo en algún lugar en el último orden de clasificación.

Original en ingles

I have a webpage with a table. The table, with 10 columns, can be sorted by each column ascending or descending.

At this moment I control order by big switch:

Func<IQueryable<DeviceUsage>, IOrderedQueryable<DeviceUsage>> orderBy;         IOrderedEnumerable<DeviceUsage> info;         switch (sortOrder)         {             case "user":                 ViewBag.sortableBy = sortOrder;                 info = unitOfWork.deviceUsageRepository.Get(where, null, null, d => d.DeviceInstance, d => d.Storage, d => d.User).OrderBy(s => s.User.FullName);                 ViewBag.Desc = true;                 return PartialView(info.ToPagedList(pageNumber, 15));             case "userDesc":                 ViewBag.sortableBy = sortOrder;                 info = unitOfWork.deviceUsageRepository.Get(where, null, null, d => d.DeviceInstance, d => d.Storage, d => d.User).OrderByDescending(s => s.User.FullName);                 ViewBag.Desc = true;                 return PartialView(info.ToPagedList(pageNumber, 15));             case "manufacturer":                 ViewBag.sortableBy = sortOrder;                 orderBy = q => q.OrderBy(o => o.DeviceInstance.Device.Manufacturer1.Name);                 break;             case "manufacturerDesc":                 ViewBag.sortableBy = sortOrder;                 orderBy = q => q.OrderByDescending(o => o.DeviceInstance.Device.Manufacturer1.Name);                 break;             .             .             .             default:                 ViewBag.sortableBy="";                 orderBy=q => q.OrderBy(o => o.DeviceInstance.Device.CatalogNo);                 break;         } 

This code works but looks not nice. I think it's the longest switch I ever wrote. Can it be someway upgraded or leave it as it is?

Explanation why there is difference in logic:

As you can see in user I'm sorting by Fullname which isn't in db ( its created locally in DAL from FirstName & LastName). @Nick's approach is ok BUT adding a new Desc variable is a bit problematic because there is only the possibility to sort by ONE row at a time. So I would need to store it somewhere in the last sorting order.

  
         
         

Lista de respuestas

3
 
vote

Como una mejora rápida, debe mover la línea GET1 fuera de su declaración de caso y solo configúrelo en el valor predeterminado.

En segundo lugar, me damos cuenta de que parece haber dos tipos diferentes de lógica aquí: si alguien es un usuario o un gerente, etc. o si el orden es ascendente o descendente. Puede ser mucho más fácil hacer algo como esto:

  GET2  

Este código obviamente requiere que separe si un pedido es ascendente o no de antemano. Esto se puede hacer con la manipulación de cadenas si es necesario, pero es probable que haya una forma más fácil de usar el código que no nos ha mostrado.

 

As a quick improvement you should move the line ViewBag.sortableBy... out of your case statement and only set it in the default.

Secondly, I'm noticing there seem to be two different kinds of logic going on here: whether somebody's a user or a manager, etc. or whether the order is ascending or descending. It may be a lot easier to do something like this:

    Func<IQueryable<DeviceUsage>, IOrderedQueryable<DeviceUsage>> orderBy;     IOrderedEnumerable<DeviceUsage> info;     ViewBag.sortableBy = ascending? sortField : sortField + "desc";      switch (sortField)     {         case "user":              var deviceUsage = unitOfWork.deviceUsageRepository.Get(where, null, null, d => d.DeviceInstance, d => d.Storage, d => d.User);             var orderFunction = s => s.User.FullName;             ViewBag.Desc = true;             info = ascending? deviceUsage.OrderBy(orderFunction); : deviceUsage.OrderByDescending(orderFunction);             return PartialView(info.ToPagedList(pageNumber, 15));         case "manufacturer":             var orderFunction = o => o.DeviceInstance.Device.Manufacturer1.Name;             orderBy = ascending? q => q.OrderBy(orderFunction) : q => q.OrderByDescending(orderFunction)             break;         .         .         .         default:             ViewBag.sortableBy="";             orderBy=q => q.OrderBy(o => o.DeviceInstance.Device.CatalogNo);             break;     } 

This code obviously requires you to split out whether an order is ascending or not beforehand. This can be done with string manipulation if necessary, but there is probably an easier way using code you haven't shown us.

 
 

Relacionados problema

35  Demasiados bucles en la aplicación de dibujo  ( Too many loops in drawing app ) 
Tengo un método que tiene muchos bucles: #ifndef __RUNES_STRUCTURES_H #define __RUNES_STRUCTURES_H /* Runes structures. */ struct Game { char board[2...

6  PRIGO DE PODER TICTACTOO EN C #  ( Command prompt tictactoe in c ) 
Escribí un juego básico de comando TIC TAC TOE juego. Quiero saber qué se puede mejorar en términos de modelado y qué errores he hecho (si corresponde). vo...

0  Creación de múltiples objetos del extracto de SQL Server  ( Creating multiple objects from sql server extract ) 
He creado una solución prototipo simplificada como una especie de prueba de concepto antes de comenzar un programa más grande. Aquí están los datos de prueb...

3  Genéricos anulables - implementando secuencialSearchst en C #  ( Nullable generics implementing sequentialsearchst in c ) 
Para fines de aprendizaje, estoy implementando cierto código de SEDEDWICK & AMP; Los algoritmos de Wayne, cuarta edición . Debido a las características del...

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

3  Mientras que el bucle usa variables adicionales, ¿se puede limpiar esto?  ( While loop uses extra variables can this be cleaned up ) 
Una pieza de mi programa permite que se utilice el bucle y la incremento de una entidad seleccionada en un bucle de tiempo en otro lugar. Aquí hay una muestra...

1  TPL HILO FUGA Y FUGA DE MEMORIA  ( Tpl thread leak and memory leak ) 
Estoy tratando de rastrear lo que supongo que debo ser una pérdida de memoria / hilo en uno de mis programas. Mi programa usa una función para cargar un arc...

6  ¿Está mi delegado definió la forma correcta y necesita transformarse en una mariposa bonita?  ( Is my delegate defined the right way and does it need to transform to a pretty e ) 
He leído tantos Historias de tiempo de cama e inserciones de cómo < fuertes> delegados trabajo y por qué eventos deben ser reemplazados por los delegado...

3  Generador de imágenes de Mandelbrot con iteración paralela  ( Mandelbrot image generator with parallel iteration ) 
Actualmente estoy tratando de optimizar esta clase que tengo para la generación fractal. La ecuación está destinada a ser conectable; He usado z => z*z + c ...

7  Colecciones vacías en caché  ( Cached empty collections ) 
A menudo necesito devolver las colecciones vacías. Uno de esos días, escribí lo siguiente para devolver una instancia en caché: public static class Array<...




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