【问题标题】:How to instantiate an object within a linq query如何在 linq 查询中实例化对象
【发布时间】:2010-01-21 09:48:50
【问题描述】:

这是一个理论问题, 我正在查看其他人的代码(如下),我的简单解决方案是在 linq 之外实例化集合,但我可以猜测在某些情况下我想实例化查询中的对象,并且可能只在选择时实例化的元素。 这是一个简单的例子,说明这是如何完成的(糟糕)。

var pods = (from n in ids
where new Node(Convert.ToInt32(n)).HasValue("propertyName") 
select new
{
    Id = Convert.ToInt32(n),
    Url = new Node(Convert.ToInt32(n)).Url,
    Name = new Node(Convert.ToInt32(n)).Title()
}).ToList();

无关注意:在这种情况下,Node 构造函数正在从内存缓存中获取数据。

如何改进这个例子,使每个对象只使用 linq 实例化一次?

干杯。 穆雷。

【问题讨论】:

    标签: linq linq-to-objects instantiation


    【解决方案1】:

    像这样使用let 子句:

    var pods = (
        from n in ids
        let id = Convert.ToInt32(n)
        let node = new Node(id)
        where node.HasValue("propertyName") 
        select new
        {
            Id = id,
            Url = node.Url,
            Name = node.Title()
        }
    ).ToList();
    

    更多信息请见let clause (C# Reference):

    在查询表达式中,有时是 用于存储结果 子表达式,以便在 后续条款。你可以这样做 使用 let 关键字,它创建一个 新的范围变量并初始化它 用你的表达式的结果 供应。一旦用一个值初始化, 范围变量不能用于 存储另一个值。但是,如果 范围变量持有可查询的类型, 可以查询。

    【讨论】:

    • 谢谢,这么简单。我的谷歌技能让我失望,堆栈溢出让我振作起来:-)
    猜你喜欢
    • 2019-07-09
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    相关资源
    最近更新 更多