Reputation: 2463
Hi all I am trying to write and anonymous delegate. as the integer variable is shared among the delegate I need it to be the local instance of every delegate such that rs[0]
always gets nics[0]
, rs[1]
always gets nics[1]
and so on... how will I achieve this.
for (int i = 0; i < nics.Count; i++)
{
rs[i] = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(delegate()
{
return GetNetworkUtilization(nics[i]);
}));
}
Upvotes: 14
Views: 7654
Reputation: 172478
Put int j = i
inside your loop and refer to j
within the lambda expression.
If you are curious about why this happens, here is an MSDN blog entry containing a detailed technical explanation: Closing over the loop variable considered harmful
Upvotes: 4
Reputation: 755587
Use a local to get a different value per iteration
for (int i = 0; i < nics.Count; i++)
{
int localI = i;
rs[i] = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(delegate()
{
return GetNetworkUtilization(nics[localI]);
}));
}
Upvotes: 6
Reputation: 48255
Make a local copy of i
:
for (int i = 0; i < nics.Count; i++)
{
int j = i;
rs[i] = new RollingSeries(monitor, new RollingSeries.NextValueDelegate(delegate()
{
return GetNetworkUtilization(nics[j]);
}));
}
Upvotes: 23