【发布时间】:2012-04-28 13:41:45
【问题描述】:
我想计算 IEnumerable 列表中元素的排名并将其分配给成员。但是下面的代码仅在第一次调用时才有效。第二次调用从最后一个排名值开始。所以我得到的是 012 和 345,而不是输出 012 和 012
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 正在被捕获(关闭)并在第二次调用时重用。我不想要那种行为。有什么干净的方法来计算排名并分配它吗?
此外,r 变量(在实际代码中)不在存在foreach 循环的同一范围内。它在一个返回 var first
【问题讨论】:
标签: c# closures captured-variable