编写一个lambda表达式来对列表执行calulcation

Blu*_*ppy 3 c# lambda

我有一个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()已经存在?]

Ree*_*sey 5

就个人而言,如果要更新列表中的地方,我只想用一个简单的循环.遵循和维护将更加简单:

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)

这样做的好处是只构建一次列表,并防止复制,因为在此操作之前不会对原始序列进行评估.