Мы столкнулись с проблемами производительности и отследили их до AutoMapper, дважды перебирающего IEnumerable. С нашей стороны это легко исправить, просто загрузив AutoMapper список или массив, но мне все еще любопытно, является ли это ожидаемым поведением.

Следующий минимальный тест на воспроизведение не проходит:

[Test]
public void AutoMapper_Should_Not_Enumerate_Multiple_Times()
{
    var counter = 0;
    var values = Enumerable.Range(0, 3).Select(_ => counter++);
    var mapper = new Mapper(new MapperConfiguration(_ => { }));

    var dest= mapper.Map<int[]>(values);

    Assert.Equal(3, counter);
}

Результат: Counter = 6, dest = [3,4,5], что означает, что IEnumerable повторяется дважды, и возвращается вторая итерация.

Я попытался отладить это в AutoMapper, но я только понял, что что-то сначала вызывает Count (), а затем повторяет:

enter image description here

enter image description here

Это ожидаемое поведение? Как и где IEnumerable сопоставляется с массивом и почему перед итерацией вызывается Count ()?

2
tomfroehle 12 Фев 2021 в 01:11

1 ответ

Лучший ответ