◆ JavaScript の 「for(const v of [].entries()){}」 相当なことをやってみる

そういえば C# でも yield 機能があります
言語によっては ぜんぜん違うような使い方なものもありますが C# の機能は JavaScript とは同じような使い方です

つくるもの

JavaScript では
const l = [10, 200, 3000]
l.forEach((e, i) => console.log(`${e} ${i}`))
10 0
200 1
3000 2

を for 文にすると
const l = [10, 200, 3000]
for(const [i, e] of l.entries()){
console.log(`${e} ${i}`)
}
10 0
200 1
3000 2

と書けます

C# でも似た感じで インデックスと値の両方を取得出来るようにしてみよう思います

C# の yield

static public IEnumerable<(int index, object value)> entries(this IEnumerable items)
{
var i = 0;
foreach(var item in items)
{
yield return (i++, item);
}
}

var l = new[] { 10, 200, 3000 };
foreach (var (i, e) in l.entries())
{
Console.WriteLine($"{e} {i}");
}
10 0
200 1
3000 2

返り値を IEnumerable<T> にして yield return で T 型を返します

JavaScript の yield

JavaScript だとあえて作る必要もないのですが作ってみるとこうなります
Array.prototype.entries2 = function*(){
let i = 0
for(const item of this){
yield [i++, item]
}
}

const l = [10, 200, 3000]
for(const [i, e] of l.entries2()){
console.log(`${e} ${i}`)
}