c#从大型列表数组中连接到字符串

时间:2012-12-12 11:57:43

标签: c# optimization sql-server-2008-r2 concatenation

我有一个listArray,结构如下:

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

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

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

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

当启用注释行而不是代码按预期运行时。

任何人都可以建议一种可以提供性能改进的替代方法吗?

4 个答案:

答案 0 :(得分:0)

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

这将解决您的连接问题,因为它没有首先出现。

  

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

首先在MSDN上阅读此article

答案 1 :(得分:0)

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

这可能会或可能不会更快,具体取决于'string.Join'在内部实现的方式,在不同版本的.NET框架中可能会有所不同。

答案 2 :(得分:0)

如果您以牺牲可读性为代价寻求性能提升,那么在循环中使用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#

答案 3 :(得分:-2)

作为参数传递。

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);
        }
        }