通过循环遍历列表创建新的StringBuilder,删除最后一个元素

Joh*_*tos 1 .net c# vb.net stringbuilder

我知道这可能是一个不好的例子,但我在这种情况下的问题更多地与处理StringBuilder而不是我的SQL查询本身的最好/最有效的方法有关,所以请耐心等待...

作为一个示例来展示我想要实现的目标,假设我在数据库中有一个很大的表列表,所有表都具有相同的结构,我想创建一个查询来从一个单独的数据中提取数据查询.

我想这样做的方式是:

    Dim MyTables As List(Of String) = {"Table1", "Table2", "Table3" ... "TableN"}.ToList
    Dim SQLQuery As New StringBuilder

    For Each tbl As String In MyTables
        SQLQuery.AppendLine("SELECT [col1], [col2], [col3] FROM " & tbl)
        SQLQuery.AppendLine("UNION")
    Next
Run Code Online (Sandbox Code Playgroud)

再次,忽略这是否是最好的方法(尽管我很想知道是否有更好的方法,但我不希望答案在这个方向上倾斜 - 我更感兴趣的是如何知道如何在这种情况下有效地处理StringBuilder).

鉴于我这样做的方式,我的StringBuilder将UNION & vbCrLf在我需要删除的末尾有一个额外的 - 我知道我可以使用以下内容:

SQLQuery.Remove(SQLQuery.Length - ("UNION" & vbCrLf).Length, ("UNION" & vbCrLf).Length)
Run Code Online (Sandbox Code Playgroud)

当然,我可以提高效率,但我的问题基本上是使用循环创建这样一个字符串构建器的最佳/最有效的方法,其中"连接器"是一个相当大的字符串,它将是如果你按照我的方式做到了最后?

我知道这个问题是用VB编写的,但我同样对C#中的答案感到满意.谢谢!!!

das*_*ght 6

当您需要构建一个由您选择的分隔符字符串分隔的集合元素组成的字符串时,您不需要StringBuilder直接使用.此外,您甚至不需要循环:您可以使用String.Join带分隔符和方法的方法IEnumerable<T>,并返回由您指定的任何分隔符分隔的集合元素组成的字符串:

// C# answer
var query = string.Join(
    "\nUNION\n"
,   MyTables.Select(tbl => "SELECT [col1], [col2], [col3] FROM "+ tbl)
);
Run Code Online (Sandbox Code Playgroud)

注意:除非您真的希望您的RDBMS消除重复,否则请考虑使用UNION ALL运算符代替UNION.当行数很大时,这种变化对性能的影响可能很大.