【问题标题】:Converting double[,] to a string and storing in SQL Server table column将 double[,] 转换为字符串并存储在 SQL Server 表列中
【发布时间】:2018-04-18 18:43:38
【问题描述】:

我有一个如下初始化的双数组

double[,] zDataDifference = new double[2048, 2048];

为了将此数据存储在 SQL Server 表列中,我正在尝试将其转换为字符串。最初我想使用下面的代码将我的 double[] 转换为字符串,并且成功地这样做了。

String.Join(",", NICorrectedMean.Select(p => p.ToString()).ToArray());

但是由于double[,] 即(double[,]) 没有Select 方法的定义并且不存在扩展方法...

我不想使用下面的 foreach 循环,因为整个应用程序由于大量数据而挂起。

foreach(double dd in zDataRedDouble)
{
    ImageData += String.Join(",", dd);
}

有没有什么快速有效的方法可以将double[*,*] 转换为 C# 中的字符串?

【问题讨论】:

  • 你考虑过序列化/反序列化,还是字符串?
  • 我尝试了 NewtonSoft 和使用 StringBuilder 而不是 String 的 foreach 循环。 foreach 循环的速度是原来的两倍。
  • 我尝试了 Dmitry 的解决方案,而且 foreach 解决方案在很长一段时间内仍然是最快的。
  • @Kevin 将其发布为答案!
  • 虽然我质疑将这么多数据保存到数据库字段是否明智,但为什么要将其保存为字符串而不是 BLOB?作为字符串,您需要使用 G17 格式说明符来确保往返数据的准确性。在大多数情况下,我希望字符串表示会比存储在 BLOB 中的每双精度 8 个字节消耗更多的存储空间。

标签: c# arrays winforms sql-server-2008


【解决方案1】:

您的 foreach 解决方案速度慢的原因是您使用的是字符串,并为循环的每次迭代(4,194,304 次迭代)进行字符串连接。通过使用 StringBuilder,您可以显着提高性能。如果易用性很重要,我会将其序列化为 json 并以这种方式存储,它还可以很容易地重新初始化您的数组(您也可以使其异步,因此如果没有任何依赖它,它不会减慢您的应用程序首先被添加到数据库中)。

Foreach 使用 StringBuilder(最快的方式):

var ImageData = new StringBuilder();

foreach (var dd in zDataDifference)
{
   ImageData.Append(dd + ",");
}

易用性:

var ImageData = JsonConvert.SerializeObject(zDataDifference);

【讨论】:

    【解决方案2】:

    尝试OfType<double>() 以获得IEnumerable<double>,您可以将其发送到Join

    double[,] zDataDifference = new double[2048, 2048];
    
    ...
    
    string result = string.Join(",", zDataDifference.OfType<double>());
    

    但要小心:2048 * 2048 == 4194304 items 意味着大量内存(和时间)

    编辑: StringBuilder 解决方案(基于Kevin 的 回答)

       // In order NOT to reallocate the memory in the process, 
       // let's estimate imageData size in anvance.
       // Let us expect each item to be not more than of 20 characters
       var ImageData = new StringBuilder(2048 * 2048 * 20);
    
       foreach (var item in zDataDifference) {
         // We should add ',' before each item except the very first one
         if (ImageData.Length > 0)
           ImageData.Append(',');
    
         // Try to avoid creating a lot of small strings: item + ","
         ImageData.Append(item);
       }
    
       string result = ImageData.ToString();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-17
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多