Vb.net 使用LINQ ToDictionary过滤自定义词典-“;无法强制转换类型为';系统.集合.通用.词典'2';

Vb.net 使用LINQ ToDictionary过滤自定义词典-“;无法强制转换类型为';系统.集合.通用.词典'2';,vb.net,linq,dictionary,lambda,todictionary,Vb.net,Linq,Dictionary,Lambda,Todictionary,我已经创建了一个Dictionary类(以MyDictionary为例)。我目前正在尝试将MyDictionary传递到一个函数中,将其过滤到MyDictionary的一个新实例中,并将这个新实例传递到另一个方法中 当我试图通过Lambda表达式和ToDictionary方法从过滤后的MyDictionary第一个实例创建第二个实例时,我得到以下错误: 无法将“System.Collections.Generic.Dictionary`2[System.Int32,System.String]”

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

当我试图通过Lambda表达式和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
提前感谢,, -亚伦


根据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实例有什么想法吗?

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

换句话说,派生较少的类型无法自动转换为派生较多的类型。

因为,
MyDictionary
Dictionary(整数、字符串)
是完全不同的类型,即使一个派生自另一个

ToDictionary
调用返回一个
字典(整数、字符串)
,然后您尝试将该字典转换为
MyDictionary

您可以创建自己的
tomydicative
扩展方法来解决以下问题:

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
Dim di2作为MyDictionary=_
其中(函数(w)w.Value.包含(“T”))_
.ToMyDictionary(函数(tdk)tdk.键,函数(tdv)tdv.值)
' ...
公共共享功能ToMyDictionary(Of T)(_
ByVal源作为IEnumerable(属于T)_
ByVal键选择器作为Func(对于T,整数)_
ByVal valueSelector作为Func(属于T,字符串))作为MyDictionary
Dim结果作为新的MyDictionary
将项目变暗为T
对于源中的每个项目
添加(keySelector.Invoke(项)、valueSelector.Invoke(项))
下一个
返回结果
端函数

(如果语法不完全正确,我深表歉意:我的VB最近很生锈。)

感谢Brennen的快速回复。请看我最新的问题。谢谢LukeH的建议。虽然我非常喜欢扩展方法,但这次我可能会把它们传下去。在这一点上有点过分了。第三个例子?我只看到两个。您要做的是获取MyDictionary,对其执行一些返回字典的操作,然后将此字典转换为MyDictionary。如果没有多个MyDictionary实例,就无法实现这一点。也许如果你告诉我们你想要完成什么,有人会给你更多有用的建议。我道歉。我说了“第三个MyDictionary实例”,但实际上只有两个。总共有三个字典实例。我试图做的是从一个源中传入一个MyDictionary实例并对其进行过滤,然后返回过滤后的实例。我有不同的方法来过滤不同的方法,但是它们有相同的输入和输出。在这一点上,两个MyDictionary实例是不错的,所以除非有明显的事情我可以做不同的事情,否则我将坚持使用这个解决方案。