1

我有一个过程,我在列表中标识行(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);

提前致谢。

4

2 回答 2

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);
于 2013-05-19T08:20:18.267 回答
3

但是如何使用 linq 设置值

你没有。时期。

Linq 是一种查询语言,查询就是阅读。

有些人滥用后门来设定价值观。在您的情况下,它看起来像:

pingtree.Nodes.Where(...)
              .Select(n => { n.DeleteFlag = true; return n; }

但这真的没有完成。首先是因为出乎意料。Linq 方法,包括Select,应该保持源集合不变。其次,由于延迟执行,语句本身没有做任何事情。您必须强制执行(例如 by ToList())才能使其生效。

也许这看起来像吹毛求疵,但当查询变得更复杂时,它就成为一个重点。Select进行投影 ( ) 后跟过滤器 ( )的情况并不少见Where。例如,您可以决定在投影之后进行过滤(其中 n.Deleted == false)。

因此,您使用 linq 查询对象,然后遍历它们以执行任何需要完成的操作。ToList().ForEach()是您可以用来执行此操作的方法之一。

侧节点:我展示的后门在使用 linq-to-sql 或实体框架时会抛出异常。

于 2013-05-19T09:05:40.337 回答