这是返回类型集合的最直接方式吗?
对不起重复的问题。现在我正在寻找一种更好的方式......
这是代码的关键行,它返回一个隐式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 :(得分:2)
关于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))
答案 1 :(得分:1)
不,没有LINQ方法,因为Collection<T>
类不是它使用的集合类型之一。
您可以将IEnumerable<T>
转换为实现List<T>
的{{1}},并且IList<T>
的构造函数需要Collection<T>
:
IList<T>