Dot-Net

.NET IEnumerable 是否有相當於 Python 的 enumerate()

  • September 30, 2019

我找不到相關的問題。

由於python這樣,您可以輕鬆地遍歷序列(listgenerator)並同時收集迭代的索引enumerate(seq)

>>> for (i,item) in enumerate(["toto","titi","tutu"]):
...     print i, item
...
0 toto
1 titi
2 tutu

IEnumerable 是否有類似的東西,例如,將 a 轉換為IEnumerable<T>a IEnumerable<Tuple<Int32,T>>

(我知道由於 .. 中的正確功能,這很容易完成,Select()但如果它存在,我寧願使用它:))

更新 僅供參考,我很好奇這種可能性能夠做類似的事情:“給我滿足這個條件的最後一個項目的索引”,然後通過以下方式完成:

myEnumeration.First(t => some condition on t.Item2 ... ).Item1;

Tuple<,>您可以使用 a KeyValuePair<,>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}");
   }
}

引用自:https://stackoverflow.com/questions/7389047