【发布时间】:2011-03-09 15:36:01
【问题描述】:
我正在审查我不久前编写的一段代码,我只是讨厌我处理排序的方式 - 我想知道是否有人可以向我展示更好的方法。
我有一个课程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 ...
}
我有一个方法可以调用 List 以根据用户选择的枚举进行排序。该方法使用了一个 mondo switch 语句,它有 40 多个案例(啊!)。
下面的简短 sn-p 说明了代码:
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 语句最终会变得如此之大,以至于完全无法管理。
谁能告诉我是否有更好的方法来对我的列表进行排序?
【问题讨论】:
-
为什么要进行这种排序?是否仅用于展示目的?
-
@Hans,该类实例是从包含投资组合分析数据的 Excel 电子表格反序列化的。实际操作是从 Excel 工具栏按钮调用的(但这实际上无关紧要),一旦完成排序,我会将对象重新序列化回电子表格。排序实际上会影响 Excel 电子表格中的各种其他元素,因此它不是纯粹的仅显示。
-
扩展我对马克的回答的评论......您是否可以重构代码以更类似于数据库的形式处理数据?如果您使用更多数据库样式的格式,您甚至可能不需要枚举(因为您可以根据需要简单地从“表”中添加和删除列),所以如果您愿意投入时间/精力去做这样的重构,你可能会得到更优雅的东西,可以这么说。当然,您的程序在其他地方的某些方面可能会使这种方法不像看起来那样可行......
-
@code4life:这与您的问题无关,但如果您使用的是 Excel 电子表格,为什么需要从其中提取数据?是不是不能直接用 COM 来操作数据?
-
@JAB,数据来自投资组合分析电子表格 (Excel),因此在框架的这一部分中,大多数类都旨在支持电子表格功能。要改变这一点需要进行重大的重构......但我觉得这并不相关,所以我一开始就省略了这一点。