【问题标题】:Cast Linq IEnumerable to Class that inherits Ienumerable将 Linq IEnumerable 强制转换为继承 Ienumerable 的类
【发布时间】:2009-12-08 14:02:52
【问题描述】:

我有一个结果集类:

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)。

还是我在这里做错了什么?

【问题讨论】:

    标签: linq ienumerable casting


    【解决方案1】:

    调用Select 的结果不是AResultSet,这就是强制转换失败的原因。查询中的任何内容都不知道您要创建AResultSet。仅仅因为 result 和 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)
    

    【讨论】:

      【解决方案2】:

      虽然我不清楚您为什么要创建一个类来复制 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 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        相关资源
        最近更新 更多