2

我正在尝试解决有关列表类型的问题。首先,我的数据库中有一个存储过程,它选择单个列,我尝试在我的 VB 应用程序中继续它。通过创建一个方法函数,我声明了一个通过 SqlCommand 加载的 DataTable(具有 CloseConnection 行为)。之后,我公开声明了一个 List(Of String) ,它需要使用正在进行的存储过程中的行/项目来填充。下面是我的代码片段:

Dim dt As New DataTable()

        Try
            If conn.State = ConnectionState.Open Then
                conn.Close()
            Else
                conn.Open()
                Dim cmd = New SqlCommand("LoadCodes", conn)
                cmd.CommandType = CommandType.StoredProcedure

                dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection))
                Dim collection As New List(Of DataRow)
                collection = dt.AsEnumerable.ToList

                LPrefix = collection.Cast(Of String)()

            End If
        Catch ex As Exception
            MsgBox(ex.Message + vbCritical)
        End Try

这是LPrefix = collection.Cast(Of String)()我收到异常错误的地方,告诉我我无法真正转换它。旧的时尚方式是使用 for/for 每个循环进行迭代,但这不是我想要最好地利用性能的方式,特别是如果列表将包含来自单个列的数千行。所以基本上我想在不使用 For/For Each 循环的情况下将该 DataTable 中的这些项目插入到 List(Of String) 中。

在 Visual Studio 2010 Ultimate、.NET Framework 4.0 上运行。

4

2 回答 2

3

你根本不需要你collection的。使用 LINQ,您可以直接从数据表中提取第一列:

dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection))  
LPrefix = (From row In dt.AsEnumerable()
           Select row.Field(Of String)(0)).ToList()

当然,这可能会在内部使用循环,但由于您想将每个值复制到字符串列表中,如果不循环遍历数据行就无法做到这一点。


另一种选择是使用 anIEnumerable(Of String)而不是 a List(Of String)

dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection))  
Dim LPrefixNew As IEnumerable(Of String) = _
    From row In dt.AsEnumerable()
    Select row.Field(Of String)(0)

您可以像遍历列表一样遍历 IEnumerable,但评估是惰性的:只要您不访问元素,就不会遍历 DataTable。因此,访问这个 IEnumerable 就像直接从 DataTable 中读取元素一样,只是以更方便的方式。


另一个忠告:在你衡量它之前,你不应该尝试对性能进行推理。例如,您的行collection = dt.AsEnumerable.ToList可能已经遍历整个 DataTable 并将每个 DataRow 引用复制到 DataRows 列表中;所以,有了这条线,你已经有了你试图避免的性能损失。

所以,不要自动假设某个For循环总是比某个单一语句慢。测量它然后优化。

于 2012-05-22T10:05:28.093 回答
1

假设您DataRow只有一列,您只需要指示ConvertAll转换它:

LPrefix = collection.ConvertAll(Function(x) x[0].ToString)

感谢Binary Warrier的 c#-2-vb 翻译!

于 2012-05-22T10:01:24.667 回答