Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在选择项之前,能否在linq查询中设置属性? < P>是否有任何方法在查询中间设置属性?_C#_.net_Linq_List_Linq To Objects - Fatal编程技术网

C# 在选择项之前,能否在linq查询中设置属性? < P>是否有任何方法在查询中间设置属性?

C# 在选择项之前,能否在linq查询中设置属性? < P>是否有任何方法在查询中间设置属性?,c#,.net,linq,list,linq-to-objects,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; 我知道我可以使用选择新产品{..在这里设置道具..}但我不想这样做 目前,我想我必须使用一个foreach来完成这项工作。是的,但您需要一个扩展方法

var products = from p in Products
               let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice
               // somehow set p.Price = pricecalc
               select p;
我知道我可以使用
选择新产品{..在这里设置道具..}
但我不想这样做


目前,我想我必须使用一个
foreach
来完成这项工作。

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

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;
    }
}
然而,我不建议这样做;Linq查询不应该产生副作用。您可能应该更改查询以返回包含更新价格的新对象。

您可以将其转换为LINQ语句,但据我所知,如果没有某种解决方法,无法显式执行此操作

Products.Select(p => {
    var pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice;
    p.Price = pricecalc;
    return p;
})
像这样的东西可以处理它,而不需要任何额外的方法:

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; 
正如其他人所说,我建议反对这种做法。

而不是

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

您可以将其破解到LINQ中,但最好在
foreach
循环中明确您正在做什么以及为什么要这样做。这在我的代码(实体框架)中起作用(但在LinqPad、LINQ to sql中不起作用)。它是最干净的(尽管我讨厌它):)。所以你得到了提示:)我首先在linqpad中尝试过(相信我,它正在工作),然后只粘贴在这里。对于linq到sql,我不确定linq查询是否会转换为sql查询
 let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice
 let pricecalc = (p.Price = p.IsDiscontinued ? 0 : p.UnitPrice)