在一个DataTable
对象中,是否增加了按名称thisRow("ColumnA")
而不是按列索引查找列值的开销thisRow(0)
?在哪种情况下这可能是一个问题.
我在一个有很多编写VB6代码经验的团队工作,我注意到没有按名称对DataTable
对象或数据网格进行列查找.即使在.NET代码中,我们也使用一组整数常量来引用这些类型的对象中的列名.我问我们的团队负责人为什么会这样,他提到在VB6中,按列名而不是索引查找数据有很多开销.这对于.NET仍然如此吗?
示例代码(在VB.NET中,但同样适用于C#):
Public Sub TestADOData() Dim dt As New DataTable 'Set up the columns in the DataTable ' dt.Columns.Add(New DataColumn("ID", GetType(Integer))) dt.Columns.Add(New DataColumn("Name", GetType(String))) dt.Columns.Add(New DataColumn("Description", GetType(String))) 'Add some data to the data table ' dt.Rows.Add(1, "Fred", "Pitcher") dt.Rows.Add(3, "Hank", "Center Field") 'Method 1: By Column Name ' For Each r As DataRow In dt.Rows Console.WriteLine( _ "{0,-2} {1,-10} {2,-30}", r("ID"), r("Name"), r("Description")) Next Console.WriteLine() 'Method 2: By Column Name ' For Each r As DataRow In dt.Rows Console.WriteLine("{0,-2} {1,-10} {2,-30}", r(0), r(1), r(2)) Next End Sub
是否存在方法2提供优于方法1的性能优势的情况?
是的,应该有一个小的开销连接到按名称而不是索引查找列.我不担心它,除非你继续在循环中查找同一列,就像你的代码示例中一样.因为这会导致轻微的开销累积到可测量的开销,具体取决于表的行数.
访问某行的特定列值的最快方法是使用DataColumn
对象本身进行查找.例如:
Dim dt As DataTable = ... Dim idColumn As DataColumn = dt.Columns("ID") Dim nameColumn As DataColumn = dt.Columns("Name") Dim descriptionColumn As DataColumn = dt.Columns("Description") For Each r As DataRow In dt.Rows ' NB: lookup through a DataColumn object, not through a name, nor an index: ' Dim id = r(idColumn) Dim name = r(nameColumn) Dim description = r(descriptionColumn) ... Next
最后一条建议:我强烈建议你不要使用数字索引!它使您的代码更加脆弱,并且更难以理解和维护:一旦列的逻辑顺序发生变化,您需要相应地调整您的代码,可能在几个地方(并且您可能很容易监督其中一个,领先到错误).如果您改为使用列名或DataColumn
对象本身进行查找,则可以更改列的顺序,而无需更改其余代码.