我在審計類的日誌條目列表凝結事件列表與LINQ
public class Audit
{
public DateTime TimeStamp { get; set; }
public string User { get; set; }
public string AuditType { get; set; }
}
所以列表可能是這樣的;
20140206 11:29:20 Owen Open
20140206 11:29:21 Owen Close
20140206 11:31:20 Owen Open
20140206 11:32:20 Owen Close
20140206 11:42:20 Owen Open
20140206 11:50:00 Owen Acknowledge
這給了我們1秒1分40秒的空白。所以開放時間最長的是中間一對1分鐘,然後在11:50確認。我正在尋找日期對,它是開放的時間,在這種情況下是1分鐘。
我知道我可以按順序處理列表,並使用TimeSpan找到最大的差距,但我認爲有一種整潔的LINQ方式可以與組一起使用?
UPDATE這並不漂亮,但這是真的擴大散步邏輯
var audits = notice.AuditEntries.Where(a => a.User == user);
DateTime? currentOpen = null;
DateTime? bestOpen = null;
DateTime? bestClose = null;
foreach (var audit in audits)
{
if (audit.AuditType == "Open")
{
if (currentOpen.HasValue) continue;
currentOpen = audit.TimeStamp;
}
if (audit.AuditType == "Close" || audit.AuditType == "Acknowledge")
{
if (currentOpen.HasValue)
{
DateTime? currentClose = audit.TimeStamp;
if (!bestOpen.HasValue)
{
bestOpen = currentOpen;
bestClose = currentClose;
}
else
{
if (bestClose.Value.Subtract(bestOpen.Value) > currentClose.Value.Subtract(currentOpen.Value))
{
bestOpen = currentOpen;
bestClose = currentClose;
}
}
currentOpen = null;
}
}
}
這取決於您的數據是什麼樣子。例如,您是否確保爲單個用戶交換序列的Open和Close/Acknoledge(當按時間戳排序時)?這個序列是否總是以Open開頭?不同的用戶穿插?你想要每個用戶還是跨用戶的結果? – ChaseMedallion
我不能保證序列會完美交替,所以我在順序步行中處理它。我只是簡化了我嘗試過的代碼,然後我會在 – owen79