public class Group
{
public string Name { get; set; }
}
Тест:
List<Group> _groups = new List<Group>();
for (int i = 0; i < 10000; i++)
{
var group = new Group();
group.Name = i + "asdasdasd";
_groups.Add(group);
}
Stopwatch _stopwatch2 = new Stopwatch();
_stopwatch2.Start();
foreach (var group in _groups)
{
var count = _groups.Count(x => x.Name == group.Name);
}
_stopwatch2.Stop();
Console.WriteLine(_stopwatch2.ElapsedMilliseconds);
Stopwatch _stopwatch = new Stopwatch();
_stopwatch.Start();
foreach (var group in _groups)
{
var count = _groups.Where(x => x.Name == group.Name).Count();
}
_stopwatch.Stop();
Console.WriteLine(_stopwatch.ElapsedMilliseconds);
Результат: первый: 2863, второй 2185
Может кто-нибудь объяснить мне, почему первый подход медленнее второго? Второй должен возвращать счетчик и ссылаться на него и сначала просто ссылаться на счет. Первый подход должен быть немного быстрее.
EDIT: я удалил списки счетчиков, чтобы предотвратить использование GC и измененный порядок, чтобы проверить, имеет ли значение порядок. Результаты почти одинаковы.
EDIT2: Эта проблема производительности не связана только с Count. Это связано с First(), FirstOrDefault(), Any() и т.д. Где + Метод всегда быстрее метода.