It depends.
Here is a performance comparison:
class Program
{
static void Main(string[] args)
{
var persons = new List<Person>();
for (int i = 0; i < 10000; i++)
{
persons.Add(new Person { Name = $"person {i}", age = i });
}
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
for (int j = 0; j < 10000; j++)
{
persons[j].age ++;
}
}
sw.Stop();
Console.WriteLine($"for loop: {sw.ElapsedMilliseconds} ms");
sw.Reset();
sw.Start();
for (int i = 0; i < 1000; i++)
{
foreach (var person in persons)
{
person.age++;
}
}
sw.Stop();
Console.WriteLine($"foreach loop: {sw.ElapsedMilliseconds} ms");
sw.Reset();
sw.Start();
for (int i = 0; i < 1000; i++)
{
persons.ForEach(person => person.age++);
}
sw.Stop();
Console.WriteLine($"Linq ForEach: {sw.ElapsedMilliseconds} ms");
Console.ReadKey();
}
}
class Person
{
public string Name { get; set; }
public int age { get; set; }
}
Output:
for loop: 453 ms
foreach loop: 527 ms
Linq ForEach: 839 ms
It is easy to see which is the best to use.