У меня есть класс-оболочка, который используется в приложении MVC, предназначенном для циклического прохода по элементам в коллекции и проверки наличия у текущего пользователя прав доступа к этому элементу, прежде чем возвращать его для отображения. По большей части это работает как шарм. Однако для одного конкретного типа объекта он работает как абсолютная собака, и я не могу понять, почему.
Классы интерфейса пишутся так:
private readonly IEnumerable<T> _ViewData;
public IEnumerator<T> GetEnumerator()
{
foreach (T item in _viewData)
{
if (item.UserCanEdit || item.UserCanView)
yield return item;
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
Теперь мой первый вопрос - проверьте мое понимание того, что здесь происходит. Возможно, я ошибаюсь, но я понимаю, что когда я пытаюсь запустить цикл foreach для коллекции объектов типов, ему никогда не нужно использовать System.Collections.IEnumerable.GetEnumerator () - конечно, этот код никогда не попадет в цель?
Проблема заключается в том, что я пытаюсь использовать эту обертку для записей файла журнала, которые доставляются через платформу сущностей в классе LogEntryViewDaya. Когда код попадает в цикл foreach внутри GetEnumerator, он останавливается на полные 6-8 секунд, хотя в перечислении есть только 20 элементов!
Вот код для LogEntryView
public class LogEntryViewData:BaseViewData
{
private LogEntry _entry;
public LogEntryViewData(LogEntry entry, ICustomerSecurityContext securityContext) : base(securityContext)
{
_entry = entry;
}
public string Application { get { return _entry.Application; } }
public string CurrentUser { get { return _entry.CurrentUser; } }
public string CustomerName { get { return _entry.CustomerName; } }
public DateTime Date { get { return _entry.Date; } }
public string Exception { get { return _entry.Exception; } }
public string HostName { get { return _entry.HostName; } }
public long Id { get { return _entry.Id; } }
public string Level { get { return _entry.Level; } }
public string Message { get { return _entry.Message; } }
public int? ProcessId { get { return _entry.ProcessId; } }
public int? ServiceId { get { return _entry.ServiceId; } }
public string ServiceName { get { return _entry.ServiceName; } }
public int? TaskId { get { return _entry.TaskId; } }
public int? TaskName { get { return _entry.TaskName; } }
public string Thread { get { return _entry.Thread; } }
}
Насколько я могу судить, при создании экземпляров этих классов нет заметной производительности - установка точки останова в конструкторе и сквозной F5 кажется гладкой, как и все.
Так почему же коллекция этих конкретных объектов так медленно перебирает? Понятия не имею: предложения с благодарностью приветствуются.