Gibt es ein C#-Äquivalent zu Pythons enumerate()
und Ruby's each_with_index
?
Heutzutage gibt es eine System.Tuple
für Ihre Pair
.
Gibt es ein C#-Äquivalent zu Pythons enumerate()
und Ruby's each_with_index
?
Meine Lösung besteht aus einer einfachen Pair-Klasse, die ich für allgemeine Zwecke erstellt habe und die operativ im Wesentlichen mit der Framework-Klasse KeyValuePair identisch ist. Dann habe ich ein paar Erweiterungsfunktionen für IEnumerable mit dem Namen Ordinate (aus dem Begriff der Mengenlehre " Ordinal ").
Diese Funktionen geben für jedes Element ein Pair-Objekt zurück, das den Index und das Element selbst enthält.
public static IEnumerable<Pair<Int32, X>> Ordinate<X>(this IEnumerable<X> lhs)
{
return lhs.Ordinate(0);
}
public static IEnumerable<Pair<Int32, X>> Ordinate<X>(this IEnumerable<X> lhs, Int32 initial)
{
Int32 index = initial - 1;
return lhs.Select(x => new Pair<Int32, X>(++index, x));
}
Nein, die gibt es nicht.
Wie andere Leute gezeigt haben, gibt es Möglichkeiten, das Verhalten von Ruby zu simulieren. Aber es ist möglich, einen Typ zu haben, der Folgendes implementiert IEnumerable die keinen Index ausweist.
Ich habe gerade eine interessante Lösung gefunden:
public class DepthAware<T> : IEnumerable<T>
{
private readonly IEnumerable<T> source;
public DepthAware(IEnumerable<T> source)
{
this.source = source;
this.Depth = 0;
}
public int Depth { get; private set; }
private IEnumerable<T> GetItems()
{
foreach (var item in source)
{
yield return item;
++this.Depth;
}
}
public IEnumerator<T> GetEnumerator()
{
return GetItems().GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
// Generic type leverage and extension invoking
public static class DepthAware
{
public static DepthAware<T> AsDepthAware<T>(this IEnumerable<T> source)
{
return new DepthAware<T>(source);
}
public static DepthAware<T> New<T>(IEnumerable<T> source)
{
return new DepthAware<T>(source);
}
}
Verwendung:
var chars = new[] {'a', 'b', 'c', 'd', 'e', 'f', 'g'}.AsDepthAware();
foreach (var item in chars)
{
Console.WriteLine("Char: {0}, depth: {1}", item, chars.Depth);
}
Dies ist Ihre Sammlung
var values = new[] {6, 2, 8, 45, 9, 3, 0};
Erstellen Sie eine Reihe von Indizes für diese Sammlung
var indexes = Enumerable.Range(0, values.Length).ToList();
Verwenden Sie den Bereich, um mit Index zu iterieren
indexes.ForEach(i => values[i] += i);
indexes.ForEach(i => Console.Write("[{0}] = {1}", i, values[i]));
Das hängt von der Klasse ab, die Sie verwenden.
Dictionary<(Of <(TKey, TValue>)>) Class For Example Support This
Die generische Klasse Dictionary<(Of <(TKey, TValue>)>) bietet eine Zuordnung von einer Menge von Schlüsseln zu einer Menge von Werten.
Für die Zwecke der Aufzählung wird jedes Element im Wörterbuch als KeyValuePair<(Of <(TKey, TValue>)>) Struktur behandelt, die einen Wert und seinen Schlüssel darstellt. Die Reihenfolge, in der die Elemente zurückgegeben werden, ist undefiniert.
foreach (KeyValuePair kvp in myDictionary) {...}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Wenn Sie LINQ verwenden, gibt es Überschreibungen der verschiedenen Funktionen, die eine Aufzählung ermöglichen. Ansonsten müssen Sie in der Regel eine Variable verwenden, die Sie selbst inkrementieren.
1 Stimmen
Können wir diese Frage auf C# 7.0 aktualisieren, wo es jetzt Tupel gibt? Ich frage mich, wie eine Lösung mit Tupeln aussehen würde.
0 Stimmen
Ist das nicht ein Merkmal von
foreach
dass Sie jedes Element absolut entkoppelt von seiner Position in der Liste verarbeiten können?