salir - que significa for en c#
¿Cómo puedo verificar si una entidad es el primer elemento de un bucle foreach? (8)
Digamos que tengo un bucle foreach.
Tengo que hacer algo con el primer objeto del ciclo que no tengo que ver con ninguno de los otros objetos.
¿Cómo puedo verificar si el artículo que está actualmente en el bucle es el primer objeto?
Algo como esto:
bool first = true;
foreach(var item in items)
{
if (first)
{
item.firstStuff();
first = false;
}
item.otherStuff();
}
Aquí hay una solución de rendimiento:
using (var erator = enumerable.GetEnumerator())
{
if (erator.MoveNext())
{
DoActionOnFirst(erator.Current);
while (erator.MoveNext())
DoActionOnOther(erator.Current);
}
}
EDITAR: Y aquí hay un LINQ:
if (enumerable.Any())
{
DoActionOnFirst(enumerable.First());
foreach (var item in enumerable.Skip(1))
DoActionOnOther(item);
}
EDIT: si las acciones en los elementos tienen firmas asignables a Func<TItem, TResult>
, puede hacer:
enumerable.Select((item, index) => index == 0 ? GetResultFromFirstItem(item) : GetResultFromOtherItem(item));
Esta es más una solución general para obtener el índice junto con cada objeto en una matriz. Debería probar las pruebas si es la primera.
List<String> entries = new List<string>();
entries.Add("zero");
entries.Add("one");
entries.Add("two");
Dictionary<int, String> numberedEntries = new Dictionary<int, string>();
int i = 0;
entries.ForEach(x => numberedEntries.Add(i++, x));
foreach (KeyValuePair<int, String> pair in numberedEntries) {
Console.WriteLine(pair.Key + ": " + pair.Value);
}
En esta configuración, la clave de KeyValuePair es el índice y el valor es el objeto en ese índice, en mi ejemplo una cadena, pero cualquier objeto podría colocarse allí. Agrega un poco de sobrecarga, pero puede usarse para determinar cualquier objeto en el índice de la lista cuando sea necesario.
Hay varias formas en que podrías hacer eso.
- Use un bucle for en su lugar
- Establecer una bandera booleana
- Use Linq para obtener la lista. Primero () y luego extender la lista.Skip (1)
Me gusta la forma de Linq, pero sin Skip (1), de esta manera también puedes usarla para el último elemento de una lista y tu código permanece limpio.
foreach(var item in items)
{
if (items.First()==item)
item.firstStuff();
else if (items.Last() == item)
item.lastStuff();
item.otherStuff();
}
No se me ocurre nada, pero
var processedFirst = false;
foreach(var x in items) {
if(!processedFirst) {
ProcessFirst(x);
processedFirst = true;
}
prueba este
bool IsFirst = true;
foreach(DataRow dr in dt.Rows)
{
if (IsFirst)
{
// do some thing
IsFirst = false;
}
}
bool first = true;
foreach(var foo in bar)
{
if (first)
{
// do something to your first item
first = false;
}
// do something else to the rest
}