Фильтровать пользовательский словарь с помощью LINQ ToDictionary - "Невозможно привести объект типа 'System.Collections.Generic.Dictionary`2" - PullRequest
1 голос
/ 07 июля 2010

Я создал класс Dictionary (например, MyDictionary). В настоящее время я пытаюсь передать MyDictionary в функцию, отфильтровать его в новый экземпляр MyDictionary и передать этот новый экземпляр в другой метод.

Когда я пытаюсь создать второй экземпляр из фильтрованного первого экземпляра MyDictionary через лямбда-выражения и метод ToDictionary, я получаю следующую ошибку:

Невозможно привести объект типа '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


За сообщение Бреннена: Я могу сделать следующее, и это нормально, я просто надеялся не делать это таким образом.

 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 голосов
/ 07 июля 2010

Как упоминает Бреннан, , 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 очень ржавый в наши дни.)

0 голосов
/ 07 июля 2010

То, что возвращается из ToDictionary, это словарь, а не MyDictionary.MyDictionary - это словарь, но не наоборот, поэтому нет смысла приводить словарь к MyDictionary.

Другими словами, менее производные типы не могут автоматически преобразовываться в более производные.типы.

...