2009-05-09 8 views
1

Y at-il un moyen dans un pour obtenir l'index de ligne?Pour chaque obtenir RowIndex

Exemple:

int rowIndex = 0; 
foreach (int a in numbers) 
{ 
    // Manipulation 
    rowIndex++; 
} 

Ce que je voudrais avoir

foreach (int a in numbers) 
{ 
    a.RowIndex; 
} 

est-il un moyen rapide de le faire? Peut-être avec l'utilisation de méthodes d'extension?

+0

duplication possible de [(C#) Récupère l'index du courant pour chaque itération] (http://stackoverflow.com/questions/43021/c-get-index-of-current-foreach-iteration) –

+0

Dupliquer de [cette question ] (http://stackoverflow.com/questions/43021/c-get-index-of-current-foreach-iteration)? –

Répondre

4

Effectuez les opérations suivantes

foreach (var item in numbers.Select((x,i) => new { Index = i, Value = x })) { 
    var index = item.Index; 
    var value = item.Value; 
    ... 
} 

Il y a une surcharge de sélection qui passe vers le bas l'index de l'élément. Ce code crée un nouveau type anonyme pour chaque élément qui comprend à la fois l'index et la valeur.

Voici une autre méthode qui rend la syntaxe légèrement plus lisible. Cela n'ajoute pas beaucoup à la solution définie localement et à l'incrémenter manuellement. Y a-t-il une raison particulière pour laquelle vous ne voulez pas le faire de cette façon?

+0

Cela fait le travail plus dans le style de la syntaxe que le demandeur semble vouloir, même si pour moi, il semble un peu moche, et ne pas vraiment ajouter une valeur supplémentaire par rapport à l'incrémentation d'une valeur locale. – Noldorin

+0

@Noldorin, je suis d'accord, mais c'est ce que l'utilisateur a demandé. Je vais ajouter quelques qualifications – JaredPar

+0

@JaredPar: Oui, en effet, le demandeur semblait vouloir quelque chose comme ça. En tout cas, c'est une bonne réponse maintenant avec l'alternative (légèrement plus agréable) et les qualifications ajoutées. – Noldorin

0

C'est probablement le moyen le plus simple, si vous voulez vous en tenir à une boucle foreach. Rien de plat, mais je pense que c'est la meilleure façon d'y aller.

int rowIndex = 0; 
foreach (int a in numbers) 
{ 
    rowIndex++; // You could of course inline this wherever rowIndex first 
       // gets used, and then simply reference rowIndex (without 
       // the increment) later. 

    // ... 
} 

Mais une fois que vous commencez à faire cela, il est probablement préférable d'utiliser un juste ordinaire pour la boucle (à moins que vous ne pouvez pas parce que la collection implémente uniquement IEnumerable et non IList/ICollection bien sûr).

Questions connexes