Я рассматриваю фрагмент кода, который написал не так давно, и просто ненавижу способ обработки сортировки - мне интересно, сможет ли кто-нибудь показать мне лучший способ.
У меня есть класс, Holding
, который содержит некоторую информацию. У меня есть другой класс, HoldingsList
, который содержит List<Holding>
член. У меня также есть enum, PortfolioSheetMapping
, который содержит около 40 элементов.
Это выглядит примерно так:
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 ...
}
У меня есть метод, который может вызывать сортировку списка в зависимости от того, какое перечисление выберет пользователь. В методе используется оператор переключения mondo, в котором более 40 случаев (тьфу!).
Ниже приведен короткий фрагмент кода:
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 ....
Моя проблема с оператором switch. switch
тесно связан с перечислением PortfolioSheetMapping
, которое может измениться завтра или на следующий день. Каждый раз, когда он меняется, мне придется пересматривать этот оператор switch и добавлять к нему еще один блок case
. Я просто боюсь, что в конечном итоге это заявление о переключении станет настолько большим, что станет совершенно неуправляемым.
Может кто-нибудь сказать мне, есть ли лучший способ отсортировать мой список?