我有一个进程,我在列表中标识行(unmatchedClient)然后调用一个单独的方法来删除它们(pingtree.RemoveNodes)。这似乎有点长,我只能通过将属性“DeleteFlag”的值设置为true来实现同样的目的。但是如何使用linq设置值?
var unmatchedClient = pingtree.Nodes.Where(x =>
_application.LoanAmount < x.Lender.MinLoanAmount ||
_application.LoanAmount > x.Lender.MaxLoanAmount ||
_application.LoanTerm < x.Lender.MinLoanTerm ||
_application.LoanTerm > x.Lender.MaxLoanTerm)
.Select(x => x.TreeNode)
.ToList();
pingtree.RemoveNodes(unmatchedClient);
提前致谢。
答案 0 :(得分:6)
喜欢这个吗?
pingtree.Nodes.Where(x =>
_application.LoanAmount < x.Lender.MinLoanAmount ||
_application.LoanAmount > x.Lender.MaxLoanAmount ||
_application.LoanTerm < x.Lender.MinLoanTerm ||
_application.LoanTerm > x.Lender.MaxLoanTerm)
.Select(x => x.TreeNode)
.ToList()
.ForEach(n=> n.DeleteFlag = true);
答案 1 :(得分:3)
但是如何使用linq设置值
你没有。周期。
Linq是查询语言,查询正在阅读。
有一些人滥用以设定价值观。在你的情况下,它看起来像:
pingtree.Nodes.Where(...)
.Select(n => { n.DeleteFlag = true; return n; }
但这确实没有完成。首先是因为它出人意料。 Linq方法(包括Select
)应该保持源集合不变。其次,因为语句本身不会因为延迟执行而做任何事情。你必须强制执行(例如通过ToList()
)才能使其生效。
也许这看起来像挑剔,但是当查询变得更复杂时,它就成了一个重点。进行投影(Select
)后跟过滤器(Where
)并不罕见。例如,您可能决定在投影后进行过滤(其中n.Deleted == false)。
因此,您使用linq查询对象,然后循环遍历它们以执行任何需要执行的操作。 ToList().ForEach()
是您可以使用的方法之一。
Side节点:我展示的后门在使用linq-to-sql或实体框架时会抛出异常。