Przeglądam kawałek kodu, który napisałem nie tak dawno temu, i po prostu nienawidzę sposobu, w jaki zajmowałem się sortowaniem - zastanawiam się, czy ktoś może być w stanie pokazać ja lepszy sposób.Szukam lepszego sposobu sortowania mojej listy <T>
Mam klasę, Holding
, która zawiera pewne informacje. Mam inną klasę, HoldingsList
, która zawiera element List<Holding>
. Mam również enum, PortfolioSheetMapping
, który ma około 40 elementów.
To rodzaj wygląda następująco:
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 ...
}
Mam metodę, która może powołać się na liście, aby być posortowane w zależności od wyliczenie użytkownik wybierze. Metoda używa instrukcji switch mondo, która ma ponad 40 przypadków (ugh!). poniżej
Krótki fragment ilustruje kod:
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 ....
Mój problem jest z instrukcji switch. Model switch
jest ściśle powiązany z enumem PortfolioSheetMapping
, który może zostać zmieniony jutro lub na następny dzień. Za każdym razem, gdy się to zmieni, będę musiał ponownie przejrzeć tę instrukcję przełączania i dodać do niej kolejny blok case
. Obawiam się, że w końcu ta zmiana będzie tak duża, że nie da się nią zarządzać.
Czy ktoś może mi powiedzieć, czy istnieje lepszy sposób sortowania mojej listy?
Dlaczego jest to sortowanie robione? Czy jest to wyłącznie w celach pokazowych? –
@Hans, instancja klasy jest deserialized z arkusza kalkulacyjnego Excel zawierającego dane analityczne portfela.Faktyczna akcja jest wywoływana z przycisku paska narzędzi programu Excel (ale to naprawdę nieistotne), a po zakończeniu sortowania ponownie przekształcam obiekty z powrotem do arkusza kalkulacyjnego. Sortowanie ma wpływ na różne inne elementy arkusza kalkulacyjnego Excel, więc nie jest to wyłącznie wyświetlanie. – code4life
Poszerzenie mojego komentarza na temat odpowiedzi Marka ... Czy możliwe jest, abyś zreorganizował swój kod tak, aby obsługiwał dane w formie bardziej zbliżonej do bazy danych? Możesz nawet nie potrzebować wyliczenia, jeśli używałeś więcej formatu bazy danych w stylu bazy danych (możesz w prosty sposób dodawać i usuwać kolumny z "tabeli"), więc jeśli chcesz poświęcić czas/wysiłek, aby to zrobić, takie refaktoryzowanie, możesz skończyć z czymś bardziej eleganckim, że tak powiem. Oczywiście, niektóre aspekty twojego programu mogą być inne, co może sprawić, że takie podejście stanie się mniej wykonalne niż się wydaje ... – JAB