【问题标题】:is it possible to convert an array of float to a string without an intermediary byte array?是否可以在没有中间字节数组的情况下将浮点数组转换为字符串?
【发布时间】:2015-11-11 10:09:35
【问题描述】:

我需要将浮点数组作为字符串发送。在应用的上下文中,我们需要尽可能好的性能。

根据我对 SO 的阅读,快速解决方案都意味着首先将浮点数组转换为字节数组,然后使用 base64 或 getBytes/getString 以及 cp1852 编码。

所以可以避免 c# 中的中间字节数组吗?

(当然,我希望同样快地进行相反的转换)

【问题讨论】:

  • 有什么理由不能只在 Float 上调用 ToString 吗?即 var str = floats.select(f=>f.ToString())
  • @MikeT OP 需要string。这将给IEnumerable<string>
  • 所以他想将浮点数组的内部二进制表示转换为字符串,而不是将浮点值本身转换为字符串?也就是说,他想把一个字节数组转换成一个字符串。
  • "那么在c#中可以避免中间字节数组吗?"中间字节数组有什么问题?时间?内存管理?为什么要消除它?
  • 如果性能是主要目标,那么您需要将所有内容保持在尽可能低的级别,因为您堆积的抽象级别越多,涉及的处理就越多,例如将浮点数转换为bytes 大约是您可以获得的最低级别,任何其他看起来更漂亮的解决方案都会降低效率

标签: c# arrays copy


【解决方案1】:

您可以尝试使用它:

string resultString = string.Join(",", floatArray);

【讨论】:

  • 如何取回一个 float[]?不是要手动解析吗
  • @SriramSakthivel - 谁想找回float[]
  • @Corak 从问题我认为这是另一个应用程序。我的观点是他可以只对数组进行序列化(xml、json、二进制或其他)并发送,而不是进行手动字符串操作。
  • 我的反向转换解决方案是:floatArray = resultString.Split(',').Select(x => float.Parse(x, CultureInfo.InvariantCulture.NumberFormat)).ToArray();
  • 为此,您应该在将浮点数组转换为字符串时使用InvariantCulture。如果小数点分隔符是,,那么您的答案将无法按预期工作。
【解决方案2】:

你想把它转换成可读的字符串表示吗?在这种情况下,您不需要将其转换为字节数组。

public static string ToDecimalValuesString(this float[] items, string separator = ", ")
{
    var result = new StringBuilder();
    for (int i = 0; i < items.Length; i++)
    {
        result.Append(items[i].ToString("R", NumberFormatInfo.InvariantInfo));
        if (i < items.Length - 1)
            result.Append(separator);
    }

    return result.ToString();
}

【讨论】:

  • 使用 LINQ 方法体归结为:return string.Join(separator, items.Select(item =&gt; item.ToString("R", NumberFormatInfo.InvariantInfo)));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 2020-12-21
  • 1970-01-01
相关资源
最近更新 更多