2009-10-08 7 views

Respuesta

15

Tengo un tipo en MiscUtil que puede ayudar con esto - SmartEnumerable. Es un nombre tonto, pero funciona :) Ver la usage page para los detalles, y si usted está usando C# 3 que puede hacer que sea aún más sencillo:

foreach (var item in temptable.Rows.AsSmartEnumerable()) 
{ 
    int index = item.Index; 
    DataRow value = item.Value; 
    bool isFirst = item.IsFirst; 
    bool isLast = item.IsLast; 
} 
+0

+1 para el Nombre :) – nawfal

20

usted tiene que crear uno usted mismo

var i = 0; 
foreach (DataRow temprow in temptable.Rows) 
{ 
    this.text = i; 
    // etc 
    i++; 
} 

o simplemente puede hacer un bucle en su lugar.

+5

+1, aunque raramente (si es que alguna vez) defiendo un 'for' en lugar de un' foreach'. Diferentes mecanismos de almacenamiento pueden funcionar muy mal en búsquedas basadas en índices (una lista vinculada, por ejemplo) y muy bien en una enumeración directa. –

+0

@Adam Comprensible, medir es probablemente lo mejor para descubrir qué camino sería mejor. – Joseph

1
int rowIndex = temptable.Rows.IndexOf(temprow); 
+2

Recomendaría en contra de eso. Probablemente le cueste mucho más que usar su propio incrementador. –

+0

Establecí un punto de interrupción en parte durante un ciclo foreach de larga ejecución mientras probaba y lo usé en una ventana de observación para ayudar a identificar cuánto tiempo más tenía que pasar. Lo suficientemente bueno para la depuración :) – NotMe

0

utilizar un bucle for, o utilizar un número entero seguir a lo largo:

int count =0; 
foreach (DataRow temprow in temptable.Rows) 
{ 
    //count is the index of the row in the array temptable.Rows 
    //this.text = temprow.INDEX???? 
    ++count; 
} 
5

En realidad no lo hacen. Una de las bellezas con foreach es que no tiene el conjunto extra de manejo de código incrementado y verifica la longitud.

Si usted quiere tener su propio índice que tendría que hacer algo como esto

int rowindex = 0; 
foreach (DataRow temprow in temptable.Rows) 
{ 
//this.text = temprow.INDEX???? 
    this.text = rowindex++; 
} 
1

No es posible con un bucle foreach estándar. La forma más sencilla es utilizar un bucle for

for (int i = 0; i < temptable.Rows.Count; i++) { 
    DataRow temprow = (DataRow)temptable.Rows[i]; 
    ... 
} 

Otra opción es utilizar un método de extensión

public static void ForEachIndex<T>(this IEnumerable<T> e, Action<T,int> del) { 
    var i = 0; 
    foreach (var cur in e) { 
    del(cur,i); 
    } 
} 

...

temptable.Rows.Cast<DataRow>.ForEachIndex((cur,index) 
{ 
    ... 
}); 
0

Puede utilizar el bucle estándar para obtener for el índice

for(int i=0; i<temptable.Rows.Count; i++) 
{ 
    var index = i; 
    var row = temptable.Rows[i]; 
} 
0

Si bien la respuesta de LFSR es correcta, estoy bastante seguro de que al llamar a .IndexOf en casi cualquier colección/lista voy a enumerar la lista hasta que encuentre una fila coincidente. Para DataTable grande esto podría ser lento.

Podría ser mejor para (i = 0; i < temptable.Rows.Count; i ++) {...} sobre la mesa. De esta forma, tiene el índice sin imponer un impuesto de búsqueda del índice.

11

Si puede utilizar LINQ, puede hacerlo de esta manera :

foreach (var pair in temptable.Rows.Cast<DataRow>() 
            .Select((r, i) => new {Row = r, Index = i})) 
{ 
    int index = pair.Index; 
    DataRow row = pair.Row; 
} 
+0

Hombre, yo iba a entrar en esta respuesta ... oh bien –

+0

Me encanta! ¡Gracias! – Lukas

1

Hola, hay una manera mucho más rápida, creo. ¡No se requiere iteración! En primer lugar, declarar una variable estática para el amigo ROWID Campo de la DataRow:

Private Shared RowIDFieldInfo As System.Reflection.FieldInfo = GetType(DataRow).GetField("_rowID", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance) 

entonces todo lo que tiene que hacer para utilizarlo es:

RowIDFieldInfo.GetValue(MyDataRow) - 1 

No he probado esto después de recurrir o de filtrado . En mi caso, no tengo la necesidad de hacer eso, así que esto funciona.

1

vale tarde que nunca ...

foreach (DataRow temprow in temptable.Rows) 
{ 
    temptable.Rows.IndexOf(temprow); 
} 
Cuestiones relacionadas