String.Format-参数列表有问题
本文关键字:有问题 列表 参数 Format- String | 更新日期: 2023-09-27 17:57:52
string nr = "42245555" //just an example number
string expression = "{5}{6}/{7}{8}";
string res = String.Format(expression, new string[] {
nr[0].ToString(),nr[1].ToString(),
nr[2].ToString(), nr[3].ToString(),
nr[4].ToString(), nr[5].ToString(),
nr[6].ToString(), nr[7].ToString()
});
为什么这不起作用,我该如何解决?我希望表达式要么是"{5}{6}/{7}{8}" or "{0}{3}/{7}{1}"
,要么是用户想要的任何表达式。
您必须至少提供与最高占位符值加一(占位符值为零索引(相同数量的参数(或具有至少相同元素数量的数组(
最大占位符值{3},必须至少提供四个附加参数。
试试这个:
string res = String.Format(expression,
nr[0], nr[1],
nr[2], nr[3],
nr[4], nr[5],
nr[6], nr[7]);
注意,我去掉了新字符串[]{…},我还去掉了所有的ToString()
,因为它们不是必需的。
Format
的相关过载为:
public static string Format(string format, params Object[] args)
这意味着你可以这样称呼它:
Format("...",new object[]{...})//Each array element is used
或者将对象直接作为参数:
Format("...",object1, object2,...)//the objects are used
与我最初的想法不同,string[]
确实进入了该代码的第一个变体。这是由于C#/.net中的数组协方差,它允许将string[]
隐式转换为object[]
。
string.Format("{0} {1}",new string[]{"A","B"})
打印CCD_ 7。
另一方面,如果你用int[]
尝试类似的代码,它不会起作用:
string.Format("{0} {1}",new int[]{1,2})
将抛出异常,因为它进入第二个变体,因此string.Format
只能看到类型为int[]
的单个参数。这种差异是因为数组协方差只适用于成员为引用类型(如string
(而不是值型(如int
(的数组。这意味着int[]
不能隐式转换为object[]
。
因此,原始代码的问题可能只是使用了超出范围的索引{8}
。
表达式中的参数必须从"{0}"
开始,array
必须包含与表达式相同数量的参数,并且必须是对象数组:new object[]{...
- 您的参数编号为0..7,易于读取。但您使用的
{8}
:索引超出范围 - 参数周围不需要
new string[] { }
。不过这是允许的 - 如果没有
new string[] { }
,您也不需要.ToString()
调用
如果您的用户想要{5}{6}/{7}{8},那么您的代码将是:
String.Format("{0}{1}/{2}{3}",nr[4],nr[5],nr[6],nr[7]);
表达式中的ur索引必须始终以0开头。在我的示例中,如果要为字符串显示此值。。对于nr[4],u以0,1,2,3..0开始,对于nr[5]为1,对于nr[6]为2,对于nr[7]为3,等等。
您必须使用:
nr.Substring(...)
在String.Format([expression],[values](表达式是一个字符串,表示带有占位符的字符串,同时将值插入这些占位符中。
更新
string nr = "42245555" //just an example number
string res = String.Format("{0}{1}/{2}{3}", new string[] {
nr[5].ToString(),nr[6].ToString(),
nr[7].ToString(), nr[8].ToString()
});
或
string res = String.Format("{0}{1}/{2}{3}", new string[] {
nr[0].ToString(),nr[3].ToString(),
nr[7].ToString(), nr[1].ToString()
});