en el siguiente ejemplo, ¿cómo puedo saber el índice de la fila actual?¿Cómo puedo saber un índice de fila mientras estoy iterando con foreach?
foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
}
en el siguiente ejemplo, ¿cómo puedo saber el índice de la fila actual?¿Cómo puedo saber un índice de fila mientras estoy iterando con foreach?
foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
}
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;
}
+1 para el Nombre :) – nawfal
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.
+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. –
@Adam Comprensible, medir es probablemente lo mejor para descubrir qué camino sería mejor. – Joseph
int rowIndex = temptable.Rows.IndexOf(temprow);
Recomendaría en contra de eso. Probablemente le cueste mucho más que usar su propio incrementador. –
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
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;
}
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++;
}
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)
{
...
});
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];
}
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.
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;
}
Hombre, yo iba a entrar en esta respuesta ... oh bien –
Me encanta! ¡Gracias! – Lukas
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.
vale tarde que nunca ...
foreach (DataRow temprow in temptable.Rows)
{
temptable.Rows.IndexOf(temprow);
}
posible duplicado de [(C#) Obtener el índice de la iteración actual del foreach] (http://stackoverflow.com/questions/43021/c-get-index- of-current-foreach-iteration) – sloth