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
    }
}
War es hilfreich?

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);
}

releated SO Frage: KeyValuePair VS Dictionary

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);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top