Erhalten der Array-Schlüssel in einer ‚foreach‘ loop
Frage
Wie erhalte ich den Schlüssel des aktuellen Elements in einer foreach
Schleife in C #?
Zum Beispiel:
PHP
foreach ($array as $key => $value)
{
echo("$value is assigned to key: $key");
}
Was ich versuche in C # zu tun:
int[] values = { 5, 14, 29, 49, 99, 150, 999 };
foreach (int val in values)
{
if(search <= val && !stop)
{
// Set key to a variable
}
}
Lösung
Grauenwolf Weg ist die direkteste und performant Weg, dies mit einer Reihe von tun:
entweder ein for-Schleife oder eine temporäre Variable erstellen, die Sie bei jedem Durchlauf erhöhen.
, die wie folgt natürlich aussehen:
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
}
Mit .NET 3.5 können Sie auch einen funktionalen Ansatz nehmen, aber es ist ein wenig ausführlicher auf der Website, und würde es wahrscheinlich auf ein paar Support-Funktionen für besuchen die Elemente in einem IEnumerable. Overkill wenn das alles ist, was Sie brauchen es für, aber praktisch, wenn Sie neigen dazu, eine Menge Sammlung Verarbeitung zu tun.
Andere Tipps
Wenn Sie sich die Schlüssel bekommen (sprich: Index), dann müssten Sie eine for-Schleife verwenden. Wenn Sie tatsächlich eine Sammlung haben wollen, die Schlüssel / Werte hält, dann würde ich eine HashTable oder ein Wörterbuch betrachten (falls Sie verwenden Generics wollen).
Dictionary<int, string> items = new Dictionary<int, string>();
foreach (int key in items.Keys)
{
Console.WriteLine("Key: {0} has value: {1}", key, items[key]);
}
Ich hoffe, das hilft, Tyler
Mit Dictionary und KeyValuePair:
Basierend auf
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);
}
Leider gibt es keine integrierte Möglichkeit, dies zu tun. Entweder ein for-Schleife oder eine temporäre Variable erstellen, die Sie bei jedem Durchlauf erhöhen.
Ich antwortete dieser in einer anderen Version dieser Frage:
Foreach ist für iterieren Sammlungen, die Umsetzung IEnumerable. Es tut dies durch den Aufruf GetEnumerator auf die Sammlung, die wird ein Enumerator zurück.
Dieses Enumerator hat ein Verfahren und eine Eigenschaft:
* MoveNext() * Current
Aktuelle kehrt das Objekt, das Enumerator ist aktuell, Movenext Aktuelles Aktuelle zum nächsten Objekt.
Offensichtlich ist das Konzept eines Index Fremd auf das Konzept der Aufzählung, und kann nicht durchgeführt werden.
Aus diesem Grund sind die meisten Sammlungen sind der Lage sein, durchlaufen einen Indexer verwendet und die for-Schleife-Konstrukt.
Ich ziehe stark ein for-Schleife in diese Situation im Vergleich zu Tracking der Index mit einer lokalen Variablen.
Wie bekommt man den Index der aktuellen Iteration eines foreach Schleife?
Eigentlich solltest du Klassiker (;;) Schleife verwenden, wenn Sie über ein Array-Schleife soll. Aber die eine ähnliche Funktionalität, die Sie mit Ihrem PHP-Code erreicht haben, kann mit einem Wörterbuch in C # wie dies erreicht werden:
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);
}
Sie können diese Funktionalität implementieren, sich eine Erweiterungsmethode verwenden. Zum Beispiel, hier ist eine Implementierung einer Erweiterungsmethode KeyValuePairs, die auf den Listen funktionieren:
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]);
}
}
Hier ist eine Lösung, die ich kam gerade mit diesem Problem
Originalcode:
int index=0;
foreach (var item in enumerable)
{
blah(item, index); // some code that depends on the index
index++;
}
Aktualisiert Code
enumerable.ForEach((item, index) => blah(item, index));
Erweiterungsmethode:
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;
}
myKey = Array.IndexOf(values, val);