Cleaner way to check for a datatable in a dataset and then remove/add datatable

What I have is functioning 100%, however I'm wondering if there is a cleaner, more effcient, or higher readability way to do this, or if checking one by one is the way to go.

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

I presume I could make a sub to do this, something like:

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

But I'd still have to call that for every DataTable so I don't see it being any more efficient.


EDIT:

I completely forgot about using a paramarray for the data tables...

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

However each iteration of the For loop is just having called one of the sets in the first option, So I still can't see much improvement in efficiency. but this option is easier to read and quite a bit more flexible.

Upvotes: 0

Views: 194

Answers (2)

pmcoltrane
pmcoltrane

Reputation: 3112

Depending on how you feel about extension methods, you could add an extension method to 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

And then your code would become:

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

Upvotes: 2

The One
The One

Reputation: 4696

Less code? (Call your method using a For Each loop)

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

Upvotes: 2

Related Questions