c# – 编写一个lambda表达式来对列表执行calulcation
我有一个List / IEnumerable对象,我想对其中一些进行计算.
例如 根据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: 鉴于此评论:
如果你真的想使用LINQ样式语法,我建议你不要在原始查询上调用ToList().如果你把它们留在原来的IEnumerable< T>表单,您可以轻松地执行上面的第二个选项,但在原始查询上: var myList = query.Select(f => f.ShouldCalculate ? f.Calculate() : f).ToList(); 这样做的好处是只构建一次列表,并防止复制,因为在此操作之前不会对原始序列进行评估. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |