2014-01-23 90 views
1

我有很多返回列表的屬性。我通常這樣做:這兩個查詢之間是否存在性能差異?

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 

回答

0

AddRange應該技術上更快,因爲在內部調用Array.Copy而不是枚舉集合,如果你正在處理一個ICollection<T>例如List<T>。在你的情況,因爲你通過Where提供IEnumerable<T>你需要調用ToList來獲得該實現(否則它只是在內部枚舉)。

除非你正在處理很多真的大列表,你可能不會看到很大的區別。還有其他的事情除了性能考慮,雖然

  • 可讀性
  • 代碼長度

第二個,在我看來,是非常整潔,並且做得非常少的代碼(但是,我就是喜歡我可以使用LINQ!)。但是,你也可以爭辯說,它的可讀性比第一個稍微低一點......它真的只是個人的品味。

+0

它只能採取陣列快捷方式,當你實際上給它一個集合。給定一個「Where」枚舉,它仍然會依次插入。 – nmclean

+0

@nmclean只有當它不支持'ICollection ',其中'List '這樣做'ToList'會解決這個問題,我已經更新了我的答案。 – James

+0

但是'ToList'創建的列表也會按順序構建,否定從'AddRange'保存的時間。如果我們不需要過濾項目,那麼我們可以執行'AddRange(c.schedules)',但由於我們確實需要生成不同的序列,所以嵌套的foreach可能更有效,因爲它只創建單個列表。儘管如此,我們仍然可以對LINQ做同樣的事情,如果我們將序列展平:'contracts.SelectMany(Function(c)c.schedules).Where(...)。ToList()' – nmclean

相關問題