在选择项目之前,您可以在linq查询中设置属性吗?

时间:2012-05-23 15:13:45

标签: c# .net linq list linq-to-objects

有没有办法在查询中设置属性?

var products = from p in Products
               let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice
               // somehow set p.Price = pricecalc
               select p;

我知道我可以使用select new Product { .. set props here .. },但我不想这样做。

此刻,我想我将不得不使用foreach来做这件事。

4 个答案:

答案 0 :(得分:2)

是的,但您需要一种扩展方法:

public static TSource Apply<TSource>(this IEnumerable<TSource> source, Action<TSource> action)
    where TSource : class // wouldn't work for value types, since the action would work on a copy
{
    foreach(var item in source)
    {
        action(item);
        yield return item;
    }
}

然后您可以像这样使用它:

var products = Products.Apply(p => p.Price = p.IsDiscontinued ? 0 : p.UnitPrice);

但是我不建议这样做; Linq查询不应该产生副作用。您应该更改查询以返回包含更新价格的新对象。

答案 1 :(得分:2)

而不是

 let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice

使用

 let pricecalc = (p.Price = p.IsDiscontinued ? 0 : p.UnitPrice)

答案 2 :(得分:1)

Products.Select(p => {
    var pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice;
    p.Price = pricecalc;
    return p;
})

答案 3 :(得分:1)

可以将其用于LINQ语句,但据我所知,如果没有某种解决方法,就没有办法明确地做到这一点。

这样的事情可以在不需要任何额外方法的情况下处理它:

var products = from p in Products                
    let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice                
    //introduce a throwaway let variable, just to modify something on p
    let ignored = p.Price = pricecalc
    select p; 

正如其他人所说,我建议不要这样做。