【问题标题】:Cleaner way to check for a datatable in a dataset and then remove/add datatable更简洁的方法来检查数据集中的数据表,然后删除/添加数据表
【发布时间】:2014-06-13 19:32:05
【问题描述】:

我所拥有的是 100% 运行,但是我想知道是否有更清洁、更有效或更高可读性的方法来执行此操作,或者是否可以一一检查。

If XMLDataSet.Tables.Contains(CabinetTable.TableName) Then
    XMLDataSet.Tables.Remove(CabinetTable.TableName)
    XMLDataSet.Tables.Add(CabinetTable)
Else
    XMLDataSet.Tables.Add(CabinetTable)
End If
If XMLDataSet.Tables.Contains(DocTypeTable.TableName) Then
    XMLDataSet.Tables.Remove(DocTypeTable.TableName)
    XMLDataSet.Tables.Add(DocTypeTable)
Else
    XMLDataSet.Tables.Add(DocTypeTable)
End If
If XMLDataSet.Tables.Contains(IndexTable.TableName) Then
    XMLDataSet.Tables.Remove(IndexTable.TableName)
    XMLDataSet.Tables.Add(IndexTable)
Else
    XMLDataSet.Tables.Add(IndexTable)
End If
If XMLDataSet.Tables.Contains(CabinetToTypeTable.TableName) Then
    XMLDataSet.Tables.Remove(CabinetToTypeTable.TableName)
    XMLDataSet.Tables.Add(CabinetToTypeTable)
Else
    XMLDataSet.Tables.Add(CabinetToTypeTable)
End If
If XMLDataSet.Tables.Contains(TypeToIndexTable.TableName) Then
    XMLDataSet.Tables.Remove(TypeToIndexTable.TableName)       
    XMLDataSet.Tables.Add(TypeToIndexTable)
Else        
    XMLDataSet.Tables.Add(TypeToIndexTable)
End If

我想我可以制作一个子来执行此操作,例如:

Private Sub addRemoveDataTable(ByRef ds As DataSet, ByVal dt As DataTable)
    If ds.Tables.Contains(dt.TableName) Then
        ds.Tables.Remove(dt.TableName)
    End If     
    ds.Tables.Add(dt)
End Sub

但我仍然必须为每个 DataTable 调用它,所以我认为它不会更有效。


编辑:

我完全忘记了对数据表使用参数数组...

Private Sub addRemoveDataTable(ByRef ds As DataSet, ByVal ParamArray dTable() As DataTable)
    For Each dt As DataTable In dTable
        If ds.Tables.Contains(dt.TableName) Then
            ds.Tables.Remove(dt.TableName)
        End If
        ds.Tables.Add(dt)
    Next
End Sub

但是,For 循环的每次迭代都只是调用了第一个选项中的一个集合,所以我仍然看不到效率有多大提高。但是这个选项更容易阅读,也更灵活。

【问题讨论】:

    标签: vb.net datatable dataset


    【解决方案1】:

    根据您对扩展方法的感受,您可以将扩展方法添加到DataSet

    Imports System.Runtime.CompilerServices
    
    Module ExtensionMethods
    
        <Extension> Public Sub Replace(ByVal dataSet As DataSet, ByVal dataTable As DataTable)
            If dataSet.Tables.Contains(dataTable.TableName) Then
                dataSet.Tables.Remove(dataTable.TableName)
            End If
            dataSet.Tables.Add(dataTable)
        End Sub
    
    End Module
    

    然后你的代码会变成:

    XMLDataSet.Replace(CabinetTable)
    XMLDataSet.Replace(DocTypeTable)
    XMLDataSet.Replace(IndexTable)
    '...
    

    【讨论】:

    • 我以前从未实现过扩展方法。是什么阻止了该扩展在数据集以外的其他东西上被调用?是什么让我无法做到not_a_dataset.replace(datatable)?我猜第一个参数是父对象,因为它被限制在它的声明中的一个数据集,这就是它知道的?
    • @BrandonB:是的,通过第一个参数。
    • @pmcoltrane 我喜欢这里的干净程度。当我有机会时,如果可以的话,我将放入一个参数数组,这样我就可以将多个表传递给它,并且只调用一次该方法。有什么理由我不能使用 param 数组作为第二个参数?
    【解决方案2】:

    代码更少? (使用 For Each 循环调用您的方法)

    For Each t in XMLDataSet.Tables
        addRemoveDataTable(XMLDataSet,t)  
    Next
    

    ...

    Private addRemoveDataTableSub(ByRef ds As DataSet, ByVal dt As DataTable)
       If ds.Tables.Contains(dt.TableName) Then
          ds.Tables.Remove(dt.TableName)
       End If     
       ds.Tables.Add(dt)
    End Sub
    

    【讨论】:

    • 在您发帖时,我编辑了我的帖子。我使用参数数组添加了 for 循环......就像我说的我仍然没有看到它更有效,它仍然必须在最后执行相同数量或更多的行,无论它们是连续的还是循环的。
    • @BrandonB 我觉得效率不会有问题,就是一个if语句,调用一个方法等等,不用担心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多