我使用string.Join来显示数组包含的值。在使用字节数组和startIndex并计数时,我偶然发现了一个奇怪的行为。
byte[] byteArr = new byte[]{1,2,3,4,5,6,7,8};
string[] stringArr = new string[] {"1","2","3","4","5","6","7","8"};
Console.WriteLine(string.Format("Whole byteArr: {0}",string.Join(", ", byteArr)));
Console.WriteLine(string.Format("Whole stringArr: {0}",string.Join(", ", stringArr)));
Console.WriteLine(string.Format("0 - 5 byteArr: {0}",string.Join(", ", byteArr,0,5)));
Console.WriteLine(string.Format("0 - 5 stringArr: {0}",string.Join(", ", stringArr,0,5)));
给出了这个结果
整个byteArr:1,2,3,4,5,6,7,8
整个stringArr:1,2,3,4,5,6,7,8
0 - 5 byteArr:System.Byte [],0,5
0 - 5 stringArr:1,2,3,4,5
为什么 string.Join(",",byteArr,0,5)返回字符串 System.Byte [],0,5
答案 0 :(得分:6)
目前,您正在调用Join
方法的这个重载,该方法使用每个元素之间的指定分隔符来连接对象数组的元素。
public static string Join(
string separator,
params object[] values
)
不是这个:
public static string Join(
string separator,
string[] value,
int startIndex,
int count
)
使用每个元素之间的指定分隔符连接字符串数组的指定元素。
这只是因为只有在提供字符串数组作为startIndex
方法的第二个参数时才会调用带有count
和Join
的重载。
因为您提供的字符串不是字符串作为Join
方法的第二个参数,所以它最终被称为上面显示的第一个重载,因此您可以使用#{1}}方法。重新看到System.Byte[], 0, 5
,因为在字节数组上调用ToString
将产生System.Byte[]
,ToString
的{{1}}表示形式为0
,{{1 }}是0
,因此结果为5
。
那么我们如何确保调用接受5
和System.Byte[], 0, 5
的版本?
如果你想调用startIndex
方法的这个重载,并且你拥有的数组不是count
,那么将你拥有的数组的元素转换为字符串数组,例如:
Join
通过执行string[]
,我们确保使用Console.WriteLine(string.Format("0 - 5 byteArr: {0}",
string.Join(", ", byteArr.Select(b => b.ToString()).ToArray(), 0, 5)));
和byteArr.Select(b => b.ToString()).ToArray()
参数来解决重载问题。