IsNumeric 函数极慢

Posted

技术标签:

【中文标题】IsNumeric 函数极慢【英文标题】:IsNumeric function extremly slow 【发布时间】:2014-03-20 11:58:13 【问题描述】:

有我从数据库中填充的 gridview,现在我想右对齐 gridview 中的所有数字项,但是如果 IsNumeric(row.Cells(i).Text) statment 需要很长时间,还有其他方法可以解决这个问题吗?

代码:

以其他方式将数字向右对齐需要很长时间

             For Each row As GridViewRow In Me.gwResult.Rows
                For i As Integer = 0 To headCell - 1
                    If IsNumeric(row.Cells(i).Text) Then
                        row.Cells(i).HorizontalAlign = HorizontalAlign.Right
                    End If
                Next
            Next

【问题讨论】:

您是否针对列的数据类型尝试了特定的 TryParse? 您应该知道表中(在数据库中)列的类型。你为什么要使用IsNumeric() 来解决你已经知道的事情? @dav1dsm1th 是正确的,除非此列包含混合值(一些字符串和一些数字)。请解释 首先,我无法访问每一列,这就是我这样做的原因,其次,gridview 是动态的,因此有时会有更多的“列”是数字的。跨度> 您是将 GridView 绑定到通用列表还是数据表? 【参考方案1】:

您在绑定DataSource 后使用此代码来识别数值,这将增加额外的时间来分析网格数据。尝试在 gridview 的 RowDataBound 事件上使用相同的代码。

【讨论】:

为什么会更快?? 因为对于所有行,RowDataBound 将被执行(如果存在)。然后您可以在绑定时检查每个行调用的值。在您的情况下,网格是绑定的,然后循环遍历每一行和每个单元格以分析值。 但我的问题是,例如,第 0 列是字符串,第 1 列是数字,第 2 列是字符串,所以我不能将一行作为数字然后我宁愿使用列,但我还没有弄清楚如何修复 gridview 给你的列。 在行数据绑定事件中,您也可以访问每个单元格及其值。 msdn.microsoft.com/en-us/library/…【参考方案2】:

您最好的选择是在将网格绑定到数据源之前找出哪些列是数字的。在GridViewRowDataBound 事件中,您可以检查当前正在数据绑定的列是否在numericColumns 集合中。

'Find numeric properties of the type beehing databound
Dim numericColumns = New HashSet(GetType(MyDataType).GetProperties() _
                     .Where(Function(x) IsNumericType(x.PropertyType)))
                     .Select(Function(x) x.Name))

'And for DataTable it would look like this
Dim numericColumns = New HashSet(dt.Columns.Cast(Of DataColumn)() _
                     .Where(Function(x) IsNumericType(x.DataType))) _
                     .Select(Function(x) x.ColumnName))

Private Shared Function IsNumericType(dataType As Type) As Boolean
   Dim code = CInt(Type.GetTypeCode(dataType ))
   Return code >= 4 AndAlso code <= 15
End Function

【讨论】:

以上是关于IsNumeric 函数极慢的主要内容,如果未能解决你的问题,请参考以下文章

Python isnumeric()方法

Python3 isnumeric()方法

Varchar 到数字的转换 - CLR 或 'e0'

从数据类型 varchar 转换为 numeric 时出错.

IsNumeric 和 Case-when 计算数值并更改其在结果中的显示方式

在函数中使用 IsNumeric