【发布时间】:2019-10-07 17:55:05
【问题描述】:
我正在寻找一种有效的方法来按函数对集合进行排序,同时根据对所述函数的评估过滤集合。举例说明:
var materialsByExpiry = from m in materials
where m.ExpiryDate() >= today
orderby m.ExpiryDate()
select m;
由于materials 是一个大型集合,而ExpiryDate 是一个重要的计算,我想尽量减少对ExpiryDate 的调用次数。显然ExpiryDate 只需要为每种材料调用一次,但这段代码调用它 n + q 次,其中 n 是总数元素的数量,q 是通过过滤器的数量。
我可以看到一种可能性是定义一个结构来存储材料及其到期日期并使用它。但是有没有更有效的方法(不用花时间制定我自己的排序/过滤算法)?
【问题讨论】:
-
如果您从
materials中选择m,为什么需要orderby?如果ExpiryDate只需要计算一次,是不是最好运行一个单独的循环,在linq之前计算和更新一个属性? -
为什么不在 ExpiryDate 函数上挂一个惰性求值器(Lazy
)?第一次计算,然后返回相同的值。 -
动态计算
ExpiryDate是有原因的吗?它可以在运行时改变吗? -
@MongZhu 这是系统的工作方式。
materials来自我正在编写的代码之外,我需要调用其类的方法来提取我们排序/过滤的值。