Нет более приятного способа, но состав немного сбивает с толку, поэтому я бы предпочел следующее:
Func<int> counter = new Func<Func<int>>(() => { var n = 0; return () => n++; })();
Редактировать: Как только что спросил CodeInChaos, внешняя лямбда выглядит избыточной.
Редактировать 2: Нет, это не избыточно, потому что вы хотите замыкание над n. Так что либо выше, либо:
Func<Func<int>> counter = () => { var n = 0; return () => n++; };
int x = counter()();
Редактировать 3: Поскольку я не уверен, хотите ли вы повторно использовать функцию счетчика, чтобы ее можно было повторно инициализировать, какой из двух сценариев (или другой сценарий) вы хотите:
Func<Func<int>> counter0 = () => { var n = 0; return () => n++; };
Console.WriteLine("Counter0:");
var count0 = counter0();
for (var i = 0; i < 5; i++)
{
Console.WriteLine(count0());
}
var count1 = counter0();
for (var i = 0; i < 5; i++)
{
Console.WriteLine(count1());
}
Console.WriteLine("Counter1:");
Func<int> counter1 = new Func<Func<int>>(() => { var n = 0; return () => n++; })();
for (var i = 0; i < 5; i++)
{
Console.WriteLine(counter1());
}
for (var i = 0; i < 5; i++)
{
Console.WriteLine(counter1());
}
Выход:
Counter0:
0
1
2
3
4
0
1
2
3
4
Counter1:
0
1
2
3
4
5
6
7
8
9