在本例中是否有本地LINQ方法返回类型化集合?



这是返回类型化集合最直接的方式吗?

很抱歉重复的问题。现在我正在寻找一个更好的方法……

这是返回IEnumerable的隐式类型的关键代码行,用于手动遍历以手动重新创建类型化集合。是否有任何本地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

LINQ的关键在于它是基于延迟执行的。

如果你这样做

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

你实际上不是在创建一个新的集合。LINQ正在创建一个枚举器,按需对col中的每个项执行。

所以,简短的回答是,不,LINQ在可枚举对象中生成项,它不返回新的集合(除了强制枚举的ToList或ToArray或ToDictionary等方法)。

如果你想要一个新的类型集合,你需要强制枚举:

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

不,LINQ没有办法做到这一点,因为Collection<T>类不是它使用的集合类型之一。

您可以将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() _
  )

相关内容

  • 没有找到相关文章

最新更新