.net: DataTable, устанавливающий все нечисловые значения таблицы данных как NULL

Нужна помощь для форматирования данных в.net, давая код ниже в vb.net

Dim dt As New DataTable
            dt.Columns.Add("a", GetType(System.String))
            dt.Columns.Add("b", GetType(System.String))

            dt.Rows.Add("N/A", "22")
            dt.Rows.Add("99", "22.3")
            dt.Rows.Add("Not Available", "#Error")
            dt.Rows.Add("5.5", "10")

Нужны предложения для преобразования таблицы данных в.net C#/vb

Преобразуйте все нечисловые значения таблицы данных в NULL, пытаясь избежать зацикливания и обновления каждой строки с помощью регулярных выражений

            'Result dt
            'a      b       
            'null   22
            '99     22.3
            'null   null
            '5.5    10

2 ответа

Решение

Хм, если вам не нужно, чтобы таблица содержала нечисловое значение для начала, и вы не получили его таким образом, вы можете написать свой собственный метод для добавления строк, который проверяет перед добавлением их, являются ли они числовыми или нет,

В противном случае я не могу придумать что-либо, препятствующее циклу, если вы не хотите использовать регулярные выражения по некоторым причинам, вы можете проверить, возможно ли преобразование (Convert.ToDouble)

Размещать рабочий код (vb)

 Dim dt As New DataTable
            dt.Columns.Add("a")
            dt.Columns.Add("b")
            dt.Columns.Add("c")

Dim typeList As New List(Of Type)
            typeList.Add(GetType(Integer))
            typeList.Add(Nothing)
            typeList.Add(GetType(Decimal))

            dt.Rows.AddRow(typeList, {10, "23ff", "Test if Numeric 45.6"})
            dt.Rows.AddRow(typeList, {"Ten", "We are here", "89"})

Метод расширения

<System.Runtime.CompilerServices.Extension()> _
    Public Sub AddRow(dr As DataRowCollection, ByRef objTypeConversion As List(Of Type), objValue As Object())
        Dim length = objTypeConversion.Count

        If length <> objValue.Length Then
            Throw New Exception("Data Types must be provided for all Values")
        End If

        Dim _n As Integer = 0
        objTypeConversion.ForEach(Function(t)
                                      If t IsNot Nothing Then
                                          Try
                                              Dim converter = TypeDescriptor.GetConverter(t)
                                              If converter IsNot Nothing Then
                                                  objValue(_n) = CTypeDynamic(converter.ConvertFrom(objValue(_n)), t)
                                              End If
                                          Catch ex As Exception
                                              objValue(_n) = DBNull.Value
                                          End Try
                                      End If
                                      _n = _n + 1
                                  End Function)

        'Logic to convert into provided datatype
        dr.Add(objValue)
    End Sub
Другие вопросы по тегам