【问题标题】:How to define local variable in a select LINQ-query如何在选择 LINQ 查询中定义局部变量
【发布时间】:2019-10-02 11:02:03
【问题描述】:

我尝试编写这段代码:

returnModel.BunkerStat=tmpBunk.Select(b =>
                 new BunkerStatisticsRowModel
                 {
                   numberOfBunk=b.NumberOfBunk,
                   procentOfBunk=numberOfBunk/100
                   }).ToList();

但我得到编译错误,因为我不能重用 numberOfBunk 来计算 procentOfBunk。有人知道我如何重用 numberOfBunk 吗?我不想重复 b.NumberOfBunk。谢谢。

已解决:

我试过这样,它成功了:

returnModel.BunkerStat=tmpBunk.Select(b =>
                     new BunkerStatisticsRowModel
                     {
                       numberOfBunk=b.NumberOfBunk,
                       procentOfBunk=numberOfBunk/100
                       }).Select((p)=>
            new BunkerStatisticsRowModel()
            {
               numberOfBunk=p.numberOfBunk,
               procentOfBunk=p.numberOfBunk/100

             }).ToList();

【问题讨论】:

  • 您不能在其构造函数中使用 BunkerStatisticsRowModel 的属性,因为您还没有对它的引用。

标签: c# .net asp.net-mvc linq


【解决方案1】:

在正文中使用 lambda

returnModel.BunkerStat = tmpBunk.Select(b => {
    var procentOfBunk = b.NumberOfBunk / 100;
    return new BunkerStatisticsRowModel
    {
        numberOfBunk = b.NumberOfBunk,
        procentOfBunk = procentOfBunk
    };
})
.ToList();

【讨论】:

  • NumberOfBunk 对于每个 BunkerStatisticsRowModel 都不同,然后我无法在外部定义它 return new BunkerStatisticsRowModel {\
  • 我看不出与 alexander soultion 和使用相同的 procentOfBunk = b.NumberOfBunk / 100 有什么区别,我能知道为什么我们需要局部变量吗?
  • @RanjithMurthy 查看问题标题“如何在选择 LINQ 查询中定义局部变量”
  • @Alexander 是的,我看到你的灵魂在 linq 块中带有局部变量,但效果仍然相同,有局部变量或没有局部变量(使用 b.NumberOfBunk )。我看不出它是最佳的。
  • 当您使用多行 lambda (b => { }) 时,您必须在每个语句的末尾添加 ;
【解决方案2】:

如果您能够在模型 BunkerStatisticsRowModel 中添加属性。

   public class BunkerStatisticsRowModel
    {
        public int procentOfBunk { get { return numberOfBunk / 100;  } }
        public int numberOfBunk { get; set; }
    }

然后像这样使用你的 linq 语句。

returnModel.BunkerStat=tmpBunk.Select(b =>
                 new BunkerStatisticsRowModel
                 {
                   numberOfBunk=b.NumberOfBunk
                   }).ToList();

您应该拥有包含 numberOfBunk 和 procentOfBunk 的 Collection。

【讨论】:

  • 这不是最优的,因为您每次访问procentOfBunk 时都在计算numberOfBunk / 100。更好的解决方案是public class BunkerStatisticsRowModel { private int tmp; public int procentOfBunk { get; private set; } public int numberOfBunk { get => tmp; set =>{ procentOfBunk = value / 100; tmp = value; }; } }
【解决方案3】:

您可以使用语句 lambda 来创建临时变量。

returnModel.BunkerStat = tmpBunk
                .Select(b =>
                    {
                        var procentOfBunk = b.NumberOfBunk / 100;
                        return new BunkerStatisticsRowModel
                        {
                            numberOfBunk = b.NumberOfBunk,
                            procentOfBunk = procentOfBunk,
                        };
                    })
                .ToList();

【讨论】:

  • NumberOfBunk 对于每个 BunkerStatisticsRowModel 都不同,然后我无法在 return new BunkerStatisticsRowModel {\ } 之外定义它
  • Select linq 函数处理序列中的每个项目。并为他们每个人调用身体中的 lambda。变量“procentOfBunk”在其作用域结束时被释放。
猜你喜欢
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
相关资源
最近更新 更多