假设我有以下LINQ语句。我想找到一种方法来使用“r.Portfolio”而我在第3个选择子句中(参见代码中的注释):
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;
答案 0 :(得分:2)
如果您需要在同一查询中使用SelectMany
和Select
,我建议您使用linq语法:
from r in positionsToOptimize
from pos in r.Positions
select new OptimizedPosition
{
CalculationType = TCalculationType.Absolute,
Position = pos.NetPositionAmount,
SecurityID = pos.SecurityID,
Portfolio = r.Portfolio
};
正如您所看到的那样,它非常干净且易于阅读,并且不需要任何其他临时对象。
答案 1 :(得分: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
});
答案 2 :(得分:1)
只需使用.orig x3000
LEA R0, HELLO_WORLD ; x3000
PUTS ; x3001
HALT ; x3002
HELLO_WORLD .stringz "HELLO WORLD" ; x3003
.end
选择最终对象即可。 SelectMany
已经在lambda的范围内了,不需要聪明。而且您不需要选择r
; p => p
已经p
。
p