sto rivedendo un pezzo di codice non scritto molto tempo fa, e ho appena odio il modo in cui ha gestito la selezione - Mi chiedo se qualcuno potrebbe essere in grado di mostrare io un modo migliore.ricerca di un modo migliore per risolvere la mia lista <T>
Ho una classe, Holding
, che contiene alcune informazioni. Ho un'altra classe, HoldingsList
, che contiene un membro List<Holding>
. Ho anche un enum, PortfolioSheetMapping
, che ha circa 40 elementi.
E 'sorta di simile a questo:
public class Holding
{
public ProductInfo Product {get;set;}
// ... various properties & methods ...
}
public class ProductInfo
{
// .. various properties, methods...
}
public class HoldingsList
{
public List<Holding> Holdings {get;set;}
// ... more code ...
}
public enum PortfolioSheetMapping
{
Unmapped = 0,
Symbol,
Quantitiy,
Price,
// ... more elements ...
}
Ho un metodo che può richiamare l'elenco di essere ordinati a seconda di quale enumerazione l'utente seleziona. Il metodo utilizza un'istruzione switch mondiale che ha oltre 40 casi (ugh!).
Un breve frammento seguente illustra il codice:
if (frm.SelectedSortColumn.IsBaseColumn)
{
switch (frm.SelectedSortColumn.BaseColumn)
{
case PortfolioSheetMapping.IssueId:
if (frm.SortAscending)
{
// here I'm sorting the Holding instance's
// Product.IssueId property values...
// this is the pattern I'm using in the switch...
pf.Holdings = pf.Holdings.OrderBy
(c => c.Product.IssueId).ToList();
}
else
{
pf.Holdings = pf.Holdings.OrderByDescending
(c => c.Product.IssueId).ToList();
}
break;
case PortfolioSheetMapping.MarketId:
if (frm.SortAscending)
{
pf.Holdings = pf.Holdings.OrderBy
(c => c.Product.MarketId).ToList();
}
else
{
pf.Holdings = pf.Holdings.OrderByDescending
(c => c.Product.MarketId).ToList();
}
break;
case PortfolioSheetMapping.Symbol:
if (frm.SortAscending)
{
pf.Holdings = pf.Holdings.OrderBy
(c => c.Symbol).ToList();
}
else
{
pf.Holdings = pf.Holdings.OrderByDescending
(c => c.Symbol).ToList();
}
break;
// ... more code ....
Il mio problema è con l'istruzione switch. Lo switch
è strettamente legato all'enum PortfolioSheetMapping
, che può cambiare domani o il giorno successivo. Ogni volta che cambierò, dovrò rivisitare questa istruzione switch e aggiungere ancora un altro blocco case
ad esso. Ho solo paura che alla fine questa affermazione di commutazione diventerà così grande da essere completamente ingestibile.
Qualcuno può dirmi se c'è un modo migliore per ordinare la mia lista?
Perché questo ordinamento stato fatto? È solo a scopo di visualizzazione? –
@Hans, l'istanza di classe viene deserializzata da un foglio di calcolo di Excel contenente dati di analisi di portafoglio.L'azione effettiva viene richiamata da un pulsante della barra degli strumenti di Excel (ma ciò è davvero irrilevante) e una volta che l'ordinamento è stato completato, rioricalizzo nuovamente gli oggetti nel foglio di calcolo. L'ordinamento influisce su vari altri elementi nel foglio di calcolo di Excel, quindi non è puramente di sola visualizzazione. – code4life
Prolungando il mio commento sulla risposta di Mark ... sarebbe possibile per voi refactoring il codice per gestire i dati in un modulo più simile al database per cominciare? Potresti non aver nemmeno bisogno dell'enumerazione se hai usato un formato più in stile database (dato che potresti semplicemente aggiungere e rimuovere le colonne dalla tua "tabella" se necessario), quindi se sei disposto a dedicare tempo/sforzi tale refactoring, si potrebbe finire con qualcosa di più elegante, per così dire. Certamente, potrebbero esserci degli aspetti del tuo programma altrove che potrebbero rendere questo approccio meno fattibile di quanto possa sembrare ... – JAB