2011-04-18 75 views
0

這是返回類型集合最直接的方法嗎?在這個例子中是否有一個本地LINQ方法來返回一個類型化的集合?

抱歉重複的問題。現在我正在尋找更好的方法...

以下是返回隱式IEnumerable類型的代碼的關鍵代碼,該代碼用於手動循環以手動重新創建TYPED集合。是否有任何本地LINQ方法返回一個類型化的排序集合,而不重新創建集合?


Dim Sorted As ErrorProviderMessageCollection = New ErrorProviderMessageCollection(From item In MyCollection Order By item.Control.TabIndex) 

Public Class ErrorProviderMessageCollection 

    Inherits System.Collections.ObjectModel.Collection(Of ErrorProviderMessage) 

    Public Sub New() 

    End Sub 

    Public Sub New(ByVal source As IEnumerable(Of ErrorProviderMessage)) 

     Dim orderedCollection = New ErrorProviderMessageCollection() 

     For Each Item As ErrorProviderMessage In source 
     Me.Add(Item) 
     Next 

    End Sub 

End Class 

Public Class ErrorProviderMessage 

    Public Sub New(ByVal message As String, ByVal control As Control) 
     _Message = message 
     _Control = control 
    End Sub 

    Public ReadOnly Property Message() As String  
    Public ReadOnly Property Control() As Control 

End Class 
+0

什麼好處呢'ErrorProviderMessageCollection'給您通過簡單的通用'名單< ErrorProviderMessage>'?在C#中,LINQ查詢末尾的一個簡單的'.ToList()'看起來就是您需要的全部內容。 – 2011-04-18 23:32:27

回答

2

關鍵的一點要記住LINQ的是,它是基於延遲執行。

如果你

Dim y = col.Where(Function(i) i.SomeProp = True) 

你是不是實際創建一個新的集合。 LINQ正在創建一個枚舉器,可以根據需要在每個項目上執行。因此,簡短的回答是,不,LINQ會產生可枚舉的項目,它不會返回新的集合(除ToList或ToArray或ToDictionary這些強制枚舉的方法外)。

如果你想有一個新的類型的集合,需要強制的枚舉:

Dim col2 = New ErrorProviderMessageCollection(col.Where(Function(i) i.SomeProp = True)) 
+0

是的,這是正確的,但它不回答問題。您無需在集合中創建一個包裝來創建它。 – Guffa 2011-04-19 00:31:25

1

不,沒有這樣做,因爲Collection<T>類的沒有LINQ的方式不在於它採用了集合類型之一。

您可以打開IEnumerable<T>List<T>,它實現IList<T>,並且對於Collection<T>一個構造函數的IList<T>

Dim Sorted As Collection<ErrorProviderMessage> = _ 
    New Collection<ErrorProviderMessage>(_ 
    (From item In MyCollection Order By item.Control.TabIndex).ToList() _ 
) 
相關問題