这两个查询之间是否存在性能差异?

时间:2014-01-23 16:23:12

标签: vb.net entity-framework

我有很多返回列表的属性。我通常这样做:

Public ReadOnly Property activeSchedulesAsOf(ByVal target As Date) As List(Of schedule)
    Get
        Dim list As New List(Of schedule)

        For Each c As Contract In contracts
            For Each s As Schedule in c.schedules
                If s.isActiveAsOf(target) Then list.add(s)
            Next
        Next

        Return list
    End Get
End Property

这样做会有什么好处吗?

Public ReadOnly Property activeSchedulesAsOf(ByVal target As Date) As List(Of schedule)
    Get
        Dim list As New List(Of schedule)

        For Each c As Contract In contracts
            list.AddRange(c.schedules.Where(Function(s) s.isActiveAsOf(target)))
        Next

        Return list
    End Get
End Property

1 个答案:

答案 0 :(得分:0)

AddRange 技术上应该更快,因为在内部调用Array.Copy而不是枚举集合,如果您正在处理ICollection<T>,例如List<T>。在您的情况下,由于您通过IEnumerable<T>提供Where,因此需要调用ToList来获取该实现(否则它只是在内部枚举)。

除非您正在处理很多真正的大型列表,否则您可能不太可能看到太多差异。除了表现之外还有其他事情需要考虑

  • 可读性
  • 代码长度

在我看来,第二个更简洁,用更少的代码来做(但是,我只是喜欢使用LINQ!)。然而,你也可以争辩说它的可读性略低于第一......这真的只是个人品味。