【问题标题】:Can this be done entirely via linq?这可以完全通过 linq 完成吗?
【发布时间】:2013-05-19 08:16:42
【问题描述】:

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

提前致谢。

【问题讨论】:

标签: c# linq


【解决方案1】:

像这样?

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);

【讨论】:

    【解决方案2】:

    但是如何使用 linq 设置值

    你没有。期间。

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      相关资源
      最近更新 更多