string.Join在字节数组和startIndex上的奇怪行为,计数

时间:2018-05-13 09:51:26

标签: c#

我使用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

1 个答案:

答案 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方法的第二个参数时才会调用带有countJoin的重载。

因为您提供的字符串不是字符串作为Join方法的第二个参数,所以它最终被称为上面显示的第一个重载,因此您可以使用#{1}}方法。重新看到System.Byte[], 0, 5,因为在字节数组上调用ToString将产生System.Byte[]ToString的{​​{1}}表示形式为0,{{1 }}是0,因此结果为5

那么我们如何确保调用接受5System.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()参数来解决重载问题。