我有一个List/IEnumerable对象,我想对其中一些进行计算.
例如myList.Where(f => f.Calculate == true).Calculate();
根据Where子句更新myList,以便执行所需的calulcation并根据需要更新整个列表.
该列表包含"行",其中金额在Month1,Month2,Month3 ... Month12,Year1,Year2,Year3-5或"Long Term"中大多数行是固定的,并且总是属于这些月中的一个,但有些" "根据他们的"到期日"进行计算.
哦,只是让事情复杂化!列表(目前)是来自几个linq查询的匿名类型.如果需要,我可以把它作为一个具体的课程,但如果我能避免它,我宁愿不这样做.
因此,我想调用一种仅适用于计算行的方法,并将正确的数量放入正确的"月份".我并不担心计算逻辑,而是如何将其变成一个易于阅读的方法来更新列表,而不是理想情况下返回一个新列表.
[是否有可能编写一个lambda扩展方法来进行计算和where - 或者这种矫枉过正是因为Where()已经存在?]
就个人而言,如果要更新列表中的地方,我只想用一个简单的循环.遵循和维护将更加简单:
for (int i=0;i<list.Count;++i)
{
if (list[i].ShouldCalculate)
list[i] = list[i].Calculate();
}
Run Code Online (Sandbox Code Playgroud)
这至少会更加明显,它会更新.LINQ期望执行查询,而不是改变数据.
如果你真的想使用LINQ,你可以 - 但如果你想得到一个List<T>结果,它仍然需要一个副本:
myList = myList.Select(f => f.ShouldCalculate ? f.Calculate() : f).ToList();
Run Code Online (Sandbox Code Playgroud)
这将Calculate()根据需要调用您的方法,并在不需要时复制原始方法.但它确实需要一个副本来创建一个新的List<T>,正如你所提到的那样(在评论中).
但是,我个人的偏好仍然是在这种情况下使用循环.我发现意图更加明确 - 另外,你避免了不必要的复制操作.
编辑#2:
鉴于此评论:
哦,只是让事情复杂化!列表(目前)是来自几个linq查询的匿名类型
如果您真的想使用LINQ样式语法,我建议ToList()您不要调用原始查询.如果您将它们保留为原始IEnumerable<T>表单,则可以轻松地执行上面的第二个选项,但是在原始查询中:
var myList = query.Select(f => f.ShouldCalculate ? f.Calculate() : f).ToList();
Run Code Online (Sandbox Code Playgroud)
这样做的好处是只构建一次列表,并防止复制,因为在此操作之前不会对原始序列进行评估.
| 归档时间: |
|
| 查看次数: |
831 次 |
| 最近记录: |