从LINQ语句中的外部select子句访问对象

时间:2017-12-07 18:37:24

标签: c# .net linq

假设我有以下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;

3 个答案:

答案 0 :(得分:2)

如果您需要在同一查询中使用SelectManySelect,我建议您使用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