如何在C#中将数值数组格式化为指定格式的字符串?
想要利用String.Format的public static string Format (string format, params object?[] args);重载,实现类似Python中str.format(*args)的效果——将数组中的元素按指定格式分别占位输出。
但调用以下代码时触发错误:
var a = String.Format("{0} {1:0.00000000e+000} {2:0.00000000e+000}", new Double[] {1,2,3} );
错误提示:
Index (zero based) must be greater than or equal to zero and less than the size of the argument list.
若改为调用var a = String.Format("{0}", new Double[] {1,2,3} );,虽无错误,但返回结果为"System.Double[]",并非期望的"1 2.00000000e+000 3.00000000e+000"(类似Python代码a="{0:d} {1:1.8e} {2:1.8e}".format(*[1,2,3])的输出)。
此外,认为String.Concat((new Double[] { 1,2,3 }).Select(k => string.Format("{0}", k)))并非最优方案,不想浪费String.Format(String, params object[])重载的设计意义。
核心原因
C#中直接将double[]数组传给params object?[] args时,数组会被当作单个object参数传入,而非像Python的*那样自动拆分为多个独立参数。这会导致格式字符串中的占位符无法匹配足够的参数,或直接输出数组类型名。
正确实现方式
方式1:显式转换为object[](兼容所有支持params的C#版本)
double[] values = { 1, 2, 3 }; var result = string.Format("{0} {1:0.00000000e+000} {2:0.00000000e+000}", (object[])values);
通过将double[]显式转换为object[],数组中的每个元素会被当作独立参数传递给String.Format的params重载,从而正确匹配格式字符串中的{0}、{1}、{2}占位符。
方式2:使用C# 11+列表展开运算符..(更简洁)
double[] values = { 1, 2, 3 }; var result = string.Format("{0} {1:0.00000000e+000} {2:0.00000000e+000}", ..values);
..运算符会直接将数组元素逐个展开为方法参数,效果和Python的*完全一致,代码更简洁直观。
效果验证
两种方式最终都会得到期望结果:
"1 2.00000000e+000 3.00000000e+000"
内容的提问来源于stack exchange,提问作者Girardi

