1

这是一个理论上的问题,我正在查看其他人的代码(如下),我的简单解决方案是在 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();

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

如何改进此示例以仅使用 linq 实例化每个对象一次?

干杯。默里。

4

1 回答 1

5

使用这样的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 子句(C# 参考)

在查询表达式中,有时存储子表达式的结果以便在后续子句中使用它是有用的。您可以使用 let 关键字来执行此操作,该关键字创建一个新的范围变量并使用您提供的表达式的结果对其进行初始化。一旦用一个值初始化,范围变量就不能用于存储另一个值。但是,如果范围变量包含可查询类型,则可以对其进行查询。

于 2010-01-21T01:29:21.693 回答