我正在审查我不久前编写的一段代码,我非常讨厌我处理排序的方式-我想知道是否有人能够展示更好的方法。
我有一个叫做Holding
的类,其中包含一些信息。我还有另一个类HoldingsList
,其中包含一个List<Holding>
成员。我还有一个枚举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 ...
}
我有一个方法,可以根据用户选择的枚举类型来调用列表进行排序。该方法使用了一个超过40个case的大switch语句(呃!)。
下面是一个简短的代码片段:
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块。我只是担心最终这个switch语句会变得如此臃肿而难以管理。
有人能告诉我是否有更好的方法来排序我的列表吗?