2010-07-07 2 views
1

사전 클래스 (예 : MyDictionary)를 만들었습니다. 현재 MyDictionary를 함수에 전달하고 MyDictionary의 새 인스턴스에 필터를 적용하여이 새 인스턴스를 다른 메서드로 전달하려고합니다.LINQ ToDictionary가있는 필터 사용자 지정 사전 - " 'System.Collections.Generic.Dictionary`2 형식의 개체를 캐스팅 할 수 없습니다.

유형의 개체를 캐스팅 할 수 없습니다 '은 System.Collections : 나는 람다 표현식과 ToDictionary 방법을 통해 내 사전의 필터링 된 첫 번째 인스턴스에서 두 번째 인스턴스를 만들려고하고 때

, 나는 다음과 같은 오류를 얻고있다 .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의 포스트 당 -Aaron


:

여기에 단순화 된 내 코드의 버전입니다 이런 식으로하지 않기를 바랬습니다.

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 인스턴스를 건너 뛸 수있는 방법에 대한 의견이 있습니까?

+1

셋째 내 사전 예? 나는 단지 2를 본다. MyDictionary를 사용하고 사전을 반환하는 일부 작업을 수행 한 다음이 사전을 MyDictionary로 변환하면됩니다. 둘 이상의 MyDictionary 인스턴스가 없으면이 작업을 수행 할 수 없습니다. 어쩌면 당신이 성취하고자하는 것을 우리에게 말하면 누군가가 당신에게 더 유용한 제안을 줄 수 있습니다. –

+0

사과드립니다. 나는 "세 번째 MyDictionary 인스턴스"라고 말했지만 실제로는 두 개뿐입니다. 전체적으로 세 개의 사전 인스턴스가 있습니다. 내가 뭘 하려는지 소스에서 MyDictionary 인스턴스를 전달하고 그것을 필터링하고 필터링 된 인스턴스를 반환합니다. 나는 다른 방법들을 필터링하는 다른 방법들을 가지고 있지만 그것들은 동일한 입력과 출력을 가지고있다. 이 시점에서 두 개의 MyDictionary 인스턴스가 좋기 때문에 내가 할 수있는 일이 뻔뻔스럽지 않으면이 솔루션을 계속 사용할 것입니다. – Airn5475

답변

0

ToDictionary에서 반환되는 내용은 MyDictionary가 아닌 Dictionary입니다. MyDictionary는 사전이지만 다른 방법은 아니기 때문에 사전에서 MyDictionary로 변환하는 것은 의미가 없습니다.

즉, 덜 파생 된 유형을 자동으로 파생 된 유형으로 변환 할 수 없습니다.

+0

Brennen에게 감사드립니다. 내 업데이트 된 질문을 참조하십시오. – Airn5475

0

Brennan mentions, MyDictionaryDictionary(Of Integer, String)은 완전히 다른 유형입니다.

ToDictionary 호출은 Dictionary(Of Integer, String)을 반환하고 해당 사전을 MyDictionary으로 전송하려고합니다. (구문이 완전히 정확하지 않은 경우 사과. 내 VB는 매우 녹슨 요즘)

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 

:

당신은이 문제를 해결하기 위해 자신의 ToMyDictionary 확장 메서드를 만들 수

+0

LukeH에게 감사드립니다. 확장 메서드가 마음에 들지만 이번에는 확장 메서드를 전달할 것입니다. 이 시점에서 약간의 과잉 공격이 될 것입니다. – Airn5475

관련 문제