我有一個包裝類用於MVC應用程序,該應用程序設計爲循環訪問集合中的項目,並檢查當前用戶是否具有訪問該項目的權限它用於顯示。大多數情況下,它就像一個魅力。然而,對於一個特定的對象類型,它像一隻絕對的狗一樣運行,我無法弄清楚爲什麼。實現IEnumerable的MoveNext內部MoveNext的糟糕表現<T>
接口類是這樣寫的:
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類中通過實體框架提供的日誌文件條目上使用此包裝器時,問題在於此。當代碼擊中GetEnumerator內部的foreach循環時,即使枚舉中只有20個項目,它也會停留整整6-8秒!
下面是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; } }
}
代碼據我可以告訴有一個在實例化這些類沒有明顯的表現 - 把一個斷點在構造和F5ing通過似乎光滑的東西。
那麼爲什麼這些特定對象的集合如此緩慢地迭代?我不知道:感激的建議。
好的,在這裏要表現出我的無知,但是我認爲當它的構造函數被調用時,該類被填充了?這發生在它進入foreach循環之前,似乎以令人滿意的速度發生。 – 2010-12-09 14:11:55