gpt4 book ai didi

c# - 寻找一种更好的方法来排序我的 List

转载 作者:太空狗 更新时间:2023-10-29 19:59:06 25 4
gpt4 key购买 nike

我正在审查我不久前编写的一段代码,我只是讨厌我处理排序的方式 - 我想知道是否有人可以向我展示更好的方法。

我有课,Holding ,其中包含一些信息。我还有一个类(class),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 多个案例的 mondo 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紧密绑定(bind)到 PortfolioSheetMapping枚举,可以在明天或后天更改。每次更改时,我都将不得不重新访问此 switch 语句,并添加另一个 case阻止它。我只是担心这个 switch 语句最终会变得太大以至于完全无法管理。

谁能告诉我是否有更好的方法来对我的列表进行排序?

最佳答案

您正在将排序后的数据直接重新分配给您的 pf.Holdings属性,那么为什么不绕过 OrderBy 的开销呢?和 ToList并使用列表的 Sort 方法直接代替?

您可以使用 map 来保存 Comparison<T> 委托(delegate)所有支持的排序,然后调用 Sort(Comparison<T>) 与适当的代表:

if (frm.SelectedSortColumn.IsBaseColumn)
{
Comparison<Holding> comparison;
if (!_map.TryGetValue(frm.SelectedSortColumn.BaseColumn, out comparison))
throw new InvalidOperationException("Can't sort on BaseColumn");

if (frm.SortAscending)
pf.Holdings.Sort(comparison);
else
pf.Holdings.Sort((x, y) => comparison(y, x));
}

// ...

private static readonly Dictionary<PortfolioSheetMapping, Comparison<Holding>>
_map = new Dictionary<PortfolioSheetMapping, Comparison<Holding>>
{
{ PortfolioSheetMapping.IssueId, GetComp(x => x.Product.IssueId) },
{ PortfolioSheetMapping.MarketId, GetComp(x => x.Product.MarketId) },
{ PortfolioSheetMapping.Symbol, GetComp(x => x.Symbol) },
// ...
};

private static Comparison<Holding> GetComp<T>(Func<Holding, T> selector)
{
return (x, y) => Comparer<T>.Default.Compare(selector(x), selector(y));
}

关于c# - 寻找一种更好的方法来排序我的 List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3141285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com