2017-12-07 4 views
-1

次のLINQステートメントがあるとします。私は(コード内のコメントを参照してください)私は3番目のselect句にいる間、「r.Portfolio」を使用する方法を見つけるしたいと思います:LINQステートメントのouter select句からオブジェクトにアクセスする

positionsToOptimize 
    .Select(p => p) 
    .SelectMany(r => r.Positions) 
    .Select(pos => new OptimizedPosition() { 
     CalculationType = TCalculationType.Absolute, 
     Position = pos.NetPositionAmount, 
     SecurityID = pos.SecurityID, 
     Portfolio = r.Portfolio  // <- How do I do this? (Portfolio is not in 'pos') 
    }); 

基本的に私は次のforeachネストされたループ置き換えるしようとしています:

var lst = new List<OptimizedPosition>(); 
foreach (var r in positionsToOptimize) { 
    foreach (var pos in r.Positions) { 
     lst.Add(new OptimizedPosition() { 
      CalculationType = TCalculationType.Absolute, 
      Position = pos.NetPositionAmount, 
      SecurityID = pos.SecurityID, 
      SystemCode = r.SystemCode 
     }); 
    } 
} 

return lst; 
+1

なぜ3つの投影を最初に使用していますか?それぞれのオブジェクトを別のものに変えて他のものに変えるのではなく、ただ一つの投影を使用してそれを行うだけで、他のものに変えることができます。 – Servy

+0

@Servy - 分割統治を使って問題を解決しようとしていたので、複数の予測を試みました。時々私はそれがうまくいかないと思う:-) – Denis

答えて

1

最後のオブジェクトを選択するだけでSelectManyを使用してください。 rはすでにそのラムダの範囲にあります。賢くなる必要はありません。そして、p => pを選択する必要はありません。 pはすでにpでした。例については

var results = 
    positionsToOptimize 
    .SelectMany(r => 
     r.Positions.Select(pos => new OptimizedPosition() 
     { 
      CalculationType = TCalculationType.Absolute, 
      Position = pos.NetPositionAmount, 
      SecurityID = pos.SecurityID, 
      Portfolio = r.Portfolio 
     } 
    )); 
+0

パーフェクト!私はちょうどそれがうまく動作することができなかった:-) – Denis

1

anonymous typeを選択できます。このようなもの:

positionsToOptimize 
.Select(p => p) 
.SelectMany(r => r.Positions.Select(c => new { temp = r, Positions = c })) 
.Select(pos => new OptimizedPosition() 
{ 
    CalculationType = TCalculationType.Absolute, 
    Position = pos.Positions.NetPositionAmount, 
    SecurityID = pos.Positions.SecurityID, 
    Portfolio = temp.Portfolio  
}); 
+1

それをする興味深い方法!私もこれを念頭に置いておきます! – Denis

2

あなたが同じクエリでSelectManySelectを使用する必要があるとき、私は、LINQの構文を使用することをお勧め:あなたはそれを読んで、doesnのために非常にきれいで、簡単に見ることができるように

from r in positionsToOptimize 
from pos in r.Positions 
select new OptimizedPosition 
{ 
    CalculationType = TCalculationType.Absolute, 
    Position = pos.NetPositionAmount, 
    SecurityID = pos.SecurityID, 
    Portfolio = r.Portfolio 
}; 

を追加の一時オブジェクトは必要ありません。

関連する問題