【发布时间】:2015-10-02 09:41:15
【问题描述】:
我有一段导致堆栈溢出异常的 LINQ 代码,我不知道为什么。我将保持代码不变,因为我不知道哪个部分是原因。
假设我们有一个预订记录列表:
Class BookRecords
Public START_DATE As String
Public END_DATE As String
Public BOOK_NUM As String
End Class
任务是找出所有记录(1)开始时间在从现在开始的15分钟内和(2)与(1)中的记录连续。
我是这样做的:
Private Function ValidRec(RecordList As List(Of BookRecords)) As List(Of BookRecords)
Dim timeNow = Date.Now
'Valid records by itself
Dim validRecords = RecordList.Where(
Function(r)
Dim startDate As DateTime
'VVVVV stack overflow thrown at this return
Return DateTime.TryParse(r.START_DATE, startDate) AndAlso
((startDate - timeNow).TotalMinutes < 15)
End Function)
Do
'consecutive records
Dim conseRecords = RecordList.Except(validRecords).Where(
Function(r) validRecords.Any(
Function(vr) vr.END_DATE.Equals(r.START_DATE)))
If Not conseRecords.Any() Then Exit Do
validRecords = validRecords.Concat(conseRecords.Except(validRecords))
Loop
validRecords = validRecords.OrderBy(Function(vr) vr.START_DATE) _
.ThenBy(Function(vr) vr.BOOK_NUM)
'stack overflow after the ToList line
Return validRecords.ToList
End Function
代码在最后一行validRecords.ToList 之后运行良好。然后在 Return DateTime.TryParse ... 语句中发生堆栈溢出。 RecordList 和 validRecords 的大小很小(测试中均为 2 个),并且没有其他线程修改这些列表/对象。
为什么这会用完堆栈?我知道 LINQ 语句的结构可能很糟糕,并且不必要地创建了很多列表(IEnumerables?),但这是原因吗? (那将是真正的堆栈溢出,酷)
我认为将 validRecords 设为列表而不是 IEnumerable 可以避免该问题,但如果有人能指出真正的原因,我将不胜感激。
【问题讨论】:
标签: vb.net linq sql-order-by ienumerable