我创建了一个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实例有任何想法?
答案 0 :(得分:0)
ToDictionary返回的是Dictionary,而不是MyDictionary。 MyDictionary是一个字典,但不是相反,所以从Dictionary转换为MyDictionary是没有意义的。
换句话说,较少派生的类型不能自动转换为更多派生类型。
答案 1 :(得分:0)
作为Brennan mentions,MyDictionary
和Dictionary(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非常生疏。)