将Linq IEnumerable转换为继承Ienumerable的Class

时间:2009-12-08 14:02:52

标签: linq ienumerable casting

我有一个结果集类:

Public Class AResultSet
    Implements IEnumerable(Of ConcreteResult)

    Private _list As List(Of ConcreteResult)

    Public Sub New()
        _list = New List(Of ConcreteResult)
    End Sub

    Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of ConcreteResult) Implements System.Collections.Generic.IEnumerable(Of ConcreteResult).GetEnumerator
        Return _list.GetEnumerator
    End Function

    Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
        Return _list.GetEnumerator
    End Function
End Class

和linq查询:

Dim res As AResultSet = (From pk In testPackages, _
         pp In pk.PackagePriceCollection _
          Select New ConcreteResult(pk, pp))

但是我得到了一个施法错误。所以,如果我改变了

Dim res As AResultSet 

要:

Dim res As IEnumerable(Of ConcreteResult)

有效。但我想将linq查询结果转换为类型AResultSet,它也是一个IEnumerable(Of ConrecteResult)。

或者我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

调用Select 的结果不是 AResultSet,这就是演员表失败的原因。查询中没有任何内容知道您要创建AResultSet。仅仅因为结果和AResultSet都实现了相同的接口并不意味着它们是相同的类型。

您可以从结果中创建 AResultSet的实例,但是:

Dim query = (From pk In testPackages, _
     pp In pk.PackagePriceCollection _
     Select New ConcreteResult(pk, pp))
Dim res as AResultSet = new AResultSet(query.ToList)

答案 1 :(得分:0)

虽然我不清楚为什么你可能想要创建一个类来复制List(Of T)的功能,但你想要做的事情是不可能的。您应该在类中创建一个隐式(Widening)用户定义的强制转换运算符,或者创建一个带IEnumerable(Of ConcreteResult)的构造函数,并使用它来填充私有列表字段。

Public Class AResultSet
      Implements IEnumerable(Of ConcreteResult)
   Private list As List(Of ConcreteResult)
   Private Sub New(l As List(Of ConcreteResult))
      list = l
   End Sub
   Public Shared Widening Operator CType(seq As IEnumerable(Of ConcreteResult)) As AResultSet
      Return New AResultset(seq.ToList())
   End Sub
   ...
End Class