2011-04-18 76 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() _ 
) 
相关问题