时间: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