加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:47:06 所属栏目:百科 来源:网络整理
导读:我有一个List / IEnumerable对象,我想对其中一些进行计算. 例如 myList.Where(F = f.Calculate == TRUE).Calculate(); 根据Where子句更新myList,以便执行所需的calulcation并根据需要更新整个列表. 该列表包含“行”,其中金额在Month1,Month2,Month3 … Mont
我有一个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();
}

这至少会更加明显,它会更新. LINQ期望执行查询,而不是改变数据.

如果你真的想为此使用LINQ,你可以 – 但如果你想要一个List< T>,它仍然需要一份副本.作为你的结果:

myList = myList.Select(f => f.ShouldCalculate ? f.Calculate() : f).ToList();

这将根据需要调用Calculate()方法,并在不需要时复制原始方法.它确实需要一个副本来创建一个新的List< T>,正如你所提到的那样(在评论中).

但是,我个人的偏好仍然是在这种情况下使用循环.我发现意图更加明确 – 另外,你避免了不必要的复制操作.

编辑#2:

鉴于此评论:

Oh,and just to complicate things! the list (at the moment) is of an anonymous type from a couple of linq queries

如果你真的想使用LINQ样式语法,我建议你不要在原始查询上调用ToList().如果你把它们留在原来的IEnumerable< T>表单,您可以轻松地执行上面的第二个选项,但在原始查询上:

var myList = query.Select(f => f.ShouldCalculate ? f.Calculate() : f).ToList();

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读