在递归函数中结合字典?

时间:2011-04-22 16:49:03

标签: .net dictionary recursion type-conversion

我有一个函数应该递归循环一个控件,它是子节点并返回该控件中的任何表单值(文本框,复选框,单选按钮)并吐出一个字典,其中键是控件ID值是控件的文本或值。

但是我遇到了递归发生的问题,它给了我以下错误:

  

Unable to cast object of type '<UnionIterator>d__88 1 [System.Collections.Generic.KeyValuePair 2[System.String,System.String]]' to type 'System.Collections.Generic.Dictionary 2 [System.String,System.String]”。`

代码:

Public Shared Function getFormValuesInsideControl(ByVal control As Control) As Dictionary(Of String, String)
    Dim formValues As New Dictionary(Of String, String)

    If control IsNot Nothing Then
        If control.HasControls = True Then
            For Each childControl As Control In control.Controls
                formValues = formValues.Union(getFormValuesInsideControl(childControl)) 'error happens here'
            Next
        Else
            Select Case TypeName(control)
                Case "TextBox"
                    Dim textbox As TextBox = control
                    formValues.Add(formatControlName(textbox.ID), textbox.Text)
                Case "CheckBox"
                    Dim checkbox As CheckBox = control
                    If checkbox.Checked = True Then
                        formValues.Add(formatControlName(checkbox.ID), "Yes")
                    End If
                Case "RadioButton"
                    Dim radioButton As RadioButton = control
                    If radioButton.Checked = True Then
                        formValues.Add(formatControlName(radioButton.ID), "Yes")
                    End If
            End Select
        End If

    End If

    Return formValues
End Function

我看到发生了什么,但我不确定为什么或如何解决它。

如何在这一行中组合这些词典?我在LINQ中看到了这样做的例子,但由于递归方面的缘故,我认为我不能这样做。

2 个答案:

答案 0 :(得分:3)

这是因为Union正在返回IEnumerable<KeyValuePair<x,y>>而不是实际的Dictionary<x,y>

修复它你可以这样做:

     formValues.Union(getFormValuesInsideControl(childControl)).ToDictionary(function (x) x.Key, function (x) x.Value)

答案 1 :(得分:2)

尝试这样的事情:

formValues = formValues.Union(getFormValuesInsideControl(childControl)).ToDictionary(Function(o) o.Key, Function(o) o.Value)