IEnumerableリストの要素のランクを計算し、それをメンバーに割り当てたいと思います。ただし、以下のコードは、最初に呼び出された場合にのみ機能します。2回目の呼び出しは、最後のランク値から始まります。したがって、出力012と012の代わりに、012と345を取得しています。
class MyClass
{
public string Name { get; set; }
public int Rank { get; set; }
}
public void SecondTimeRankEvaluvate()
{
MyClass[] myArray = new MyClass[]
{
new MyClass() { Name = "Foo" },
new MyClass() { Name = "Bar" },
new MyClass() { Name = "Baz" }
};
int r = 0;
var first = myArray.Select(s => { s.Rank = r++; return s; });
foreach (var item in first)
{
Console.Write(item.Rank);
}
// Prints 012
Console.WriteLine("");
foreach (var item in first)
{
Console.Write(item.Rank);
}
// Prints 345
}
r
2回目に呼び出されたときに、変数がキャプチャ(クロージャ)されて再利用されていることを理解しています。私はその振る舞いを望まない。ランクを計算して割り当てるためのクリーンな方法はありますか?またr
、変数(実際のコード内)は、foreach
ループが存在するのと同じスコープにありません。それは戻る関数にありますvar first