3

クエリの途中でプロパティを設定する方法はありますか?

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 .. }ていますが、これをしたくありません。

At the moment, i am thinking i am going to have to use a foreach to do this.

4

4 に答える 4

2

それ以外の

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

使用する

 let pricecalc = (p.Price = p.IsDiscontinued ? 0 : p.UnitPrice)
于 2012-05-23T15:24:49.907 に答える
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 クエリは、副作用を引き起こすことは想定されていません。おそらく、クエリを変更して、更新された価格を含む新しいオブジェクトを返す必要があります。

于 2012-05-23T15:19:17.477 に答える
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; 

他の人が言っているように、私はこのアプローチに反対することをお勧めします。

于 2012-05-23T15:24:01.573 に答える
1
Products.Select(p => {
    var pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice;
    p.Price = pricecalc;
    return p;
})
于 2012-05-23T15:19:22.627 に答える