Могу ли я иметь увеличивающуюся переменную счетчика в LINQ?

Я хочу сделать что-то вроде этого:

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

Но я получаю сообщение об ошибке, говорящее мне, что счетчик доступен только для чтения. Есть ли способ сделать что-то подобное, не объявляя переменную вне запроса?

По сути, я просто хочу показать столбец счетчика/индекса в LINQPad (что замечательно, кстати), что означает Я не могу объявить counter заранее.


person Mike Pateras    schedule 05.02.2010    source источник


Ответы (3)


Вместо того, чтобы использовать побочные эффекты, используйте перегрузку Select, которая принимает индекс:

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

Вы могли сделать это, используя побочные эффекты, но не так, как пытались:

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

Я бы настоятельно советовал против этого, хотя.

person Jon Skeet    schedule 05.02.2010
comment
К сожалению, это не (всегда) работает с базовыми наборами строк Entity Framework. Обходным путем было бы сначала вставить эти строки в список. - person Wolfgang Grinfeld; 09.07.2019

Если вы действительно хотите, чтобы это был счетчик, а не просто индекс, просто переместите объявление счетчика за пределы выражения LINQ.

var counter = 0;
from a in stuff
select new { count = counter++; a.Name };
person JaredPar    schedule 05.02.2010
comment
Другой ответ настоятельно рекомендует против этого. stackoverflow.com/a/2209014/7724 - person bzlm; 07.07.2016

Просто добавьте две переменные здесь NumberRow для этого

.Select((x,NumberRow) => new ViewModelArchiveOrder
                    {
                        NumberRow= NumberRow + 1,
                    })
person saeed bagheri    schedule 06.05.2019