recorrido - mostrar matrices en c#
Obtener la clave de matriz en un bucle ''foreach'' (9)
¿Cómo obtengo la clave del elemento actual en un ciclo foreach
en C #?
Por ejemplo:
PHP
foreach ($array as $key => $value)
{
echo("$value is assigned to key: $key");
}
Lo que trato de hacer en C #:
int[] values = { 5, 14, 29, 49, 99, 150, 999 };
foreach (int val in values)
{
if(search <= val && !stop)
{
// Set key to a variable
}
}
En realidad, debería usar el clásico para (;;) loop si desea recorrer una matriz. Pero la funcionalidad similar que ha logrado con su código PHP se puede lograr en C # como este con un diccionario:
Dictionary<int, int> values = new Dictionary<int, int>();
values[0] = 5;
values[1] = 14;
values[2] = 29;
values[3] = 49;
// whatever...
foreach (int key in values.Keys)
{
Console.WriteLine("{0} is assigned to key: {1}", values[key], key);
}
Por desgracia, no hay una forma incorporada de hacer esto. Utilice un bucle for o cree una variable de temperatura que incremente en cada pasada.
Si desea obtener la clave (leer: índice), entonces deberá usar un ciclo for. Si realmente desea tener una colección que contenga claves / valores, entonces consideraría usar una HashTable o un Diccionario (si desea usar Generics).
Dictionary<int, string> items = new Dictionary<int, string>();
foreach (int key in items.Keys)
{
Console.WriteLine("Key: {0} has value: {1}", key, items[key]);
}
Espero que eso ayude, Tyler
myKey = Array.IndexOf(values, val);
Aquí hay una solución que acabo de presentar para este problema
Código original:
int index=0;
foreach (var item in enumerable)
{
blah(item, index); // some code that depends on the index
index++;
}
Código actualizado
enumerable.ForEach((item, index) => blah(item, index));
Método de extensión:
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumerable, Action<T, int> action)
{
var unit = new Unit(); // unit is a new type from the reactive framework (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx) to represent a void, since in C# you can''t return a void
enumerable.Select((item, i) =>
{
action(item, i);
return unit;
}).ToList();
return pSource;
}
Puede implementar esta funcionalidad usted mismo usando un método de extensión. Por ejemplo, aquí hay una implementación de un método de extensión KeyValuePairs que funciona en listas:
public struct IndexValue<T> {
public int Index {get; private set;}
public T Value {get; private set;}
public IndexValue(int index, T value) : this() {
this.Index = index;
this.Value = value;
}
}
public static class EnumExtension
{
public static IEnumerable<IndexValue<T>> KeyValuePairs<T>(this IList<T> list) {
for (int i = 0; i < list.Count; i++)
yield return new IndexValue<T>(i, list[i]);
}
}
Con DictionaryEntry y KeyValuePair:
Residencia en
MSDN
IDictionary<string,string> openWith = new Dictionary<string,string>()
{
{ "txt", "notepad.exe" }
{ "bmp", "paint.exe" }
{ "rtf", "wordpad.exe" }
};
foreach (DictionaryEntry de in openWith)
{
Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
}
// also
foreach (KeyValuePair<string,string> de in openWith)
{
Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
}
Respondí esto en otra versión de esta pregunta:
Foreach es para iterar sobre las colecciones que implementan IEnumerable. Lo hace llamando a GetEnumerator en la colección, que devolverá un Enumerator.
Este enumerador tiene un método y una propiedad:
* MoveNext() * Current
Current devuelve el objeto en el que Enumerator se encuentra actualmente, MoveNext actualiza Current al siguiente objeto.
Obviamente, el concepto de índice es ajeno al concepto de enumeración y no se puede hacer.
Debido a eso, la mayoría de las colecciones pueden atravesarse usando un indexador y la construcción for loop.
Prefiero usar un bucle for en esta situación, en comparación con el seguimiento del índice con una variable local.
¿Cómo se obtiene el índice de la iteración actual de un ciclo foreach?
La forma de Grauenwolf es la forma más directa y eficiente de hacer esto con una matriz:
Utilice un bucle for o cree una variable de temperatura que incremente en cada pasada.
Que por supuesto se vería así:
int[] values = { 5, 14, 29, 49, 99, 150, 999 };
for (int key = 0; key < values.Length; ++key)
if (search <= values[key] && !stop)
{
// set key to a variable
}
Con .NET 3.5 puede adoptar un enfoque más funcional también, pero es un poco más detallado en el sitio, y probablemente dependa de un par de funciones de soporte para visitar los elementos en un IEnumerable. Exagere si esto es todo lo que necesita, pero útil si tiende a hacer un montón de procesamiento de la colección.