使用LINQ ToDictionary过滤自定义词典 - “无法转换类型为'System.Collections.Generic.Dictionary`2的对象”

时间:2010-07-07 13:46:33

标签: vb.net linq dictionary lambda todictionary

我创建了一个Dictionary类(示例为MyDictionary)。我目前正在尝试将MyDictionary传递给一个函数,将其过滤到一个新的MyDictionary实例中,并将这个新实例传递给另一个方法。

当我尝试通过Lambda Expressions和ToDictionary方法从MyDictionary的过滤后的第一个实例创建第二个实例时,我收到以下错误:

无法将'System.Collections.Generic.Dictionary`2 [System.Int32,System.String]'类型的对象强制转换为'MyDictionary'。

我已经简化了示例并在LINQPad中重新创建了它并得到了同样的错误。

以下是我的代码的简化版本:

Sub Main
 Dim di1 As New MyDictionary
 di1(1) = "One"
 di1(2) = "Two"
 di1(3) = "Three"
 di1(4) = "Four"
 Dim di2 As MyDictionary= _
  CType(di1.Where(Function(w) w.Value.Contains("T")) _
   .ToDictionary(Function(tdk) tdk.Key, Function(tdv) tdv.Value), MyDictionary)
End Sub

Public Class MyDictionary
 Inherits Dictionary(Of Integer, String)
 Public Sub New()
  MyBase.New()
 End Sub
 Public Sub New(ByVal dictionary As IDictionary(Of Integer, String))
  MyBase.New(dictionary)
 End Sub
End Class

提前致谢, -Aaron


Per Brennen的帖子: 我能够做到以下几点,没关系,我只是希望不这样做。

 Sub Main
     Dim di1 As New MyDictionary
     di1(1) = "One"
     di1(2) = "Two"
     di1(3) = "Three"
     di1(4) = "Four"
     Dim di2 = _
      di1.Where(Function(w) w.Value.Contains("T")) _
       .ToDictionary(Function(tdk) tdk.Key, Function(tdv) tdv.Value)
     Dim di3 As New MyDictionary(di2)
 End Sub

Public Class MyDictionary
 Inherits Dictionary(Of Integer, String)
 Public Sub New()
  MyBase.New()
 End Sub
 Public Sub New(ByVal dictionary As IDictionary(Of Integer, String))
  MyBase.New(dictionary)
 End Sub
End Class

是否有其他人对如何跳过第三个MyDictionary实例有任何想法?

2 个答案:

答案 0 :(得分:0)

ToDictionary返回的是Dictionary,而不是MyDictionary。 MyDictionary是一个字典,但不是相反,所以从Dictionary转换为MyDictionary是没有意义的。

换句话说,较少派生的类型不能自动转换为更多派生类型。

答案 1 :(得分:0)

作为Brennan mentionsMyDictionaryDictionary(Of Integer, String)是完全不同的类型,即使其中一个派生自另一个。

ToDictionary调用返回Dictionary(Of Integer, String),然后您尝试将该字典投射到MyDictionary

您可以创建自己的ToMyDictionary扩展程序来解决此问题:

Dim di2 As MyDictionary = _
    di1.Where(Function(w) w.Value.Contains("T")) _
       .ToMyDictionary(Function(tdk) tdk.Key, Function(tdv) tdv.Value)

' ...

<Extension()>
Public Shared Function ToMyDictionary(Of T)( _
    ByVal source As IEnumerable(Of T), _
    ByVal keySelector As Func(Of T, Integer), _
    ByVal valueSelector As Func(Of T, String)) As MyDictionary

    Dim result As New MyDictionary
    Dim item As T

    For Each item In source
        result.Add(keySelector.Invoke(item), valueSelector.Invoke(item))
    Next

    Return result
End Function

(如果语法不完全正确,请道歉:这些天我的VB非常生疏。)