时间:2019-06-01 标签:c#concat to string from large list array

Posted

技术标签:

【中文标题】时间:2019-06-01 标签:c#concat to string from large list array【英文标题】:c# concate to string from large listarray 【发布时间】:2012-11-30 03:03:49 【问题描述】:

我有一个具有以下结构的 listArray:

listArray[0] insert_idlist = listArray (value, value, value, ect)

该数组在每个维度中包含大约 2000 个值。

var string_list = "'" + string.Join("', '", insert_idlist[0]) + "'";
//var string_list = "'0169624'";

出于数据库查询的目的,我试图将第一个维度连接成一个字符串,如上所述。但是,在部署时,这会导致程序挂起,并且根据以前对部署环境的经验,我怀疑大量值是原因。

当启用注释行时,代码会按预期运行。

谁能提出一种替代的连接方法来提高性能?

【问题讨论】:

别猜了。剖析并找出实际的瓶颈(您可能对原因是正确的,但很可能是错误的)。 @Oded 我上午的大部分时间都在处理这个问题。这绝对是原因。 你做过时间测量吗?串联需要多长时间?您确定连接(不是数据库查询本身)是瓶颈吗? @default locale 鉴于我们对部署环境的访问级别,我很确定这是不可能的。 本地测试的设置与生产环境类似吗?您需要检查在哪里花费的时间。是串联吗?网络IO?服务器? 【参考方案1】:

您可以尝试使用 'StringBuilder' 并使用 'capacity' 构造函数参数预先分配足够的空间。这样,在构建目标字符串时,不必一次又一次地将字符串复制到更长的缓冲区。 然后,您可以使用 foreach 语句或类似语句进行连接。

这可能会也可能不会更快,这取决于“string.Join”在内部是如何实现的,这在不同版本的 .NET 框架中可能会有所不同。

【讨论】:

【参考方案2】:

我认为您可以使用 表值参数 将列表传递给 DB。

这将首先解决您的连接问题。

表值参数提供了一种编组多行的简单方法 从客户端应用程序到 SQL Server 的数据,而无需 多次往返或特殊的服务器端逻辑来处理 数据。您可以使用表值参数来封装数据行 在客户端应用程序中,并以单个方式将数据发送到服务器 参数化命令。传入的数据行存储在一个表中 然后可以使用 Transact-SQL 操作的变量。

首先阅读 MSDN 上的 article。

【讨论】:

假设 SQL Server 2005+ 是的,确实如此。它还假设 OP 想要将元素列表传递给 db 查询。 @all 这没关系。 sql server是2008 r2 @Jakub 你能解释一下吗?我对表值参数不是很熟悉【参考方案3】:

如果您希望以牺牲可读性为代价来获得性能提升,那么在循环中使用 StringBuilder 应该比 String.Join<T>(string, IEnumerable<T>) 更快(如果您避免使用 foreach 则更快)。

看看:

Stringbuilder in foreach slower than in for and String.Join() SUCKS on collections?

String.Join performance issue in C#

【讨论】:

【参考方案4】:

作为参数传递。

using (SqlCommand command = new SqlCommand("SELECT * FROM Dogs1 WHERE Name LIKE @Name", connection))
        
        //
        // Add new SqlParameter to the command.
        //
        command.Parameters.Add(new SqlParameter("Name", dogName));          
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        
            int weight = reader.GetInt32(0);
            string name = reader.GetString(1);
            string breed = reader.GetString(2);
            Console.WriteLine("Weight = 0, Name = 1, Breed = 2", weight,name,breed);
        
        

【讨论】:

你怎么知道这些不是作为参数传入的?即使他们不是,为什么这会让事情变得更快? 当然,它可以防止 SQL 注入。这和这个问题有什么关系?

以上是关于时间:2019-06-01 标签:c#concat to string from large list array的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时以编程方式从本地数据库获取连接字符串?时间:2019-06-01 标签:c#winforms

MySQL:GROUP_CONCAT 结果的条件?

mybatis : trim标签, “等于==”经验, CDATA标签 ,模糊查询CONCAT,LIKE

针对标签上的多对多连接优化 MySQL 查询

C#Windows窗体在标签框上输出一个带有值的句子

使用 concat 助手渲染组件