【问题标题】:Can I have an incrementing count variable in LINQ?我可以在 LINQ 中有一个递增的计数变量吗?
【发布时间】:2010-02-05 17:19:01
【问题描述】:

我想做这样的事情:

from a in stuff
let counter = 0
select new { count = counter++, a.Name };

但我收到一条错误消息,告诉我计数器是只读的。有没有办法做类似的事情,而不在查询之外声明一个变量?

基本上,我只想在LINQPad 中显示一个计数/索引列(这太棒了,顺便说一句),这意味着我不能提前声明计数器。

【问题讨论】:

    标签: linq linqpad


    【解决方案1】:

    不要使用副作用,而是使用带有索引的Select 的重载:

    stuff.Select((value, index) => new { index, value.Name });
    

    可以使用副作用来做到这一点,但不是以您尝试的方式:

    int counter = 0;
    var query = from a in stuff
                select new { count = counter++, a.Name };
    

    我强烈建议不要这样做。

    【讨论】:

    • 不幸的是,这并不(总是)适用于实体框架核心行集。一种解决方法是先将这些行粘贴到列表中。
    • 请解释为什么您强烈反对这样做
    • @tjmoore:因为 LINQ 是为没有副作用的管道设计的。例如,我最后给出的查询本身不会做任何事情。这只是设置了管道 - 您必须使用查询才能计算任何内容...并且每次迭代 query 时都会计算 if。这种事情在现实世界中可能真的很令人困惑(而不是琐碎的例子)
    【解决方案2】:

    如果你真的希望它是一个计数器,而不仅仅是一个索引,那么只需将计数器声明移到 LINQ 表达式之外

    var counter = 0;
    from a in stuff
    select new { count = counter++; a.Name };
    

    【讨论】:

    【解决方案3】:

    只需在此处添加两个变量 NumberRow 即可

    .Select((x,NumberRow) => new ViewModelArchiveOrder
                        {
                            NumberRow= NumberRow + 1,
                        })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      相关资源
      最近更新 更多