Dot-Net
.NET IEnumerable 是否有相當於 Python 的 enumerate()
我找不到相關的問題。
由於
python這樣,您可以輕鬆地遍歷序列(list等generator)並同時收集迭代的索引enumerate(seq):>>> for (i,item) in enumerate(["toto","titi","tutu"]): ... print i, item ... 0 toto 1 titi 2 tutuIEnumerable 是否有類似的東西,例如,將 a 轉換為
IEnumerable<T>aIEnumerable<Tuple<Int32,T>>?(我知道由於 .. 中的正確功能,這很容易完成,
Select()但如果它存在,我寧願使用它:))更新 僅供參考,我很好奇這種可能性能夠做類似的事情:“給我滿足這個條件的最後一個項目的索引”,然後通過以下方式完成:
myEnumeration.First(t => some condition on t.Item2 ... ).Item1;
Tuple<,>您可以使用 aKeyValuePair<,>which 是結構,而不是使用 a (這是一個類)。這將避免列舉時的記憶體分配(不是說它們非常昂貴,但仍然如此)。public static IEnumerable<KeyValuePair<int, T>> Enumerate<T>(this IEnumerable<T> items) { return items.Select((item, key) => new KeyValuePair(key, item)); }
C# 7 最終允許您以一種優雅的方式做到這一點:
static class Extensions { public static IEnumerable<(int, T)> Enumerate<T>( this IEnumerable<T> input, int start = 0 ) { int i = start; foreach (var t in input) yield return (i++, t); } } class Program { static void Main(string[] args) { var s = new string[] { "Alpha", "Bravo", "Charlie", "Delta" }; foreach (var (i, o) in s.Enumerate()) Console.WriteLine($"{i}: {o}"); } }