如何计算IEnumerable <T>的等级并将其存储在T类中

Ank*_*ush 0 c# closures captured-variable

我想计算IEnumerable列表中元素的等级并将其分配给成员.但是下面的代码仅在第一次调用时起作用.第二次通话从最后一个等级值开始.所以我没有输出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
    }
Run Code Online (Sandbox Code Playgroud)

我知道变量r被捕获(闭包)并在第二次调用时重用.我不希望这种行为.是否有任何干净的方法来计算排名并分配它?也r变量(在实际的代码)不是在同一范围内,其中foreach环是存在的.它是一个返回的功能var first

tec*_*man 5

var first = myArray.Select((s, i) => { s.Rank = i; return s; });
Run Code Online (Sandbox Code Playgroud)