在此示例中是否有返回类型集合的本机LINQ方法?

时间:2011-04-18 23:11:05

标签: vb.net 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

2 个答案:

答案 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>