2010-02-05 5 views
36

voglio fare qualcosa di simile:Posso avere una variabile di conteggio incrementale in LINQ?

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

Ma ottengo un errore di dirmi che contatore è di sola lettura. C'è un modo per fare qualcosa di simile a questo, senza dichiarare una variabile al di fuori della query?

Fondamentalmente, voglio solo mostrare una colonna count/index in LINQPad (che è eccezionale, BTW), il che significa che non posso dichiarare il contatore in anticipo.

risposta

83

Invece di utilizzare gli effetti collaterali, usa il sovraccarico di Select che prende un indice:

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

È potrebbe farlo utilizzando effetti collaterali, ma non nel modo in cui si è tentato:

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

Vorrei fortemente sconsigliarlo.

6

Se veramente si vuole che sia un contatore, e non solo un indice, poi basta spostare la dichiarazione contatore esterno l'espressione LINQ

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

Un'altra risposta sconsiglia vivamente questo. http://stackoverflow.com/a/2209014/7724 – bzlm