【发布时间】:2015-12-08 09:49:48
【问题描述】:
我创建了一个函数来过滤和排序列表的内容。
这似乎有点“小”,但 Linq 不是强项。我想知道是否可以从性能角度甚至美学角度简化该功能。
代码如下:
// 反序列化 XML 以创建一类活动行
var agents = XmlHelper
.Deserialise<AgentConfigs>("~/Pingtree.xml")
.Agents
.Where(x => x.IsActive == true);
// 首先 - 获取“直接”代理并订购它们
var direct = agents
.Where(x => x.IsDirect)
.OrderByDescending(x => x.MinPrice);
// 第二个 - 获取间接代理并对其进行排序
var agency = agents
.Where(x => !x.IsDirect)
.OrderBy(x => x.Priority);
// 将 2 个子列表栓在一起,保持顺序
Agents = direct.Concat(agency).ToList();
有什么想法可以改进吗?
【问题讨论】:
-
如果解决方案运行良好,并且您希望改进/审查如何更好地构建它,请发帖至stackoverflow.com/review
-
首先,您多次迭代相同的枚举,这些枚举由 Resharper 标记,例如这可能会导致性能问题,可以通过在执行进一步查询之前在您的代理上调用
.ToList轻松避免。 -
@HimBromBeere:OP 直到最后的
ToList才执行查询。由于所涉及的 LINQ 方法的延迟执行的性质,它只枚举一次。您调用ToList两次的方法会强制对查询进行两次评估。 -
@TimSchmelter 不,我不想在帖子中提到的第一个电话之后打电话给
ToList,而不是在其他电话之后。