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

And*_*s59 5 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)));
Run Code Online (Sandbox Code Playgroud)

给出了这个结果

整个byteArr:1,2,3,4,5,6,7,8

整个弦Arrr: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

Ous*_* D. 6

目前,您正在调用此Join方法的重载,该方法使用每个元素之间的指定分隔符来连接对象数组的元素.

public static string Join(
    string separator,
    params object[] values
)
Run Code Online (Sandbox Code Playgroud)

不是这个:

public static string Join(
    string separator,
    string[] value,
    int startIndex,
    int count
)
Run Code Online (Sandbox Code Playgroud)

其中使用每个元素之间的指定分隔符连接字符串数组的指定元素.

这只是因为只有在提供字符串数组作为方法的第二个参数时,才会调用带有startIndexcount的调用Join.

因为你提供了一个不是字符串的数组作为方法的第二个参数Join,它最终被称为上面显示的第一个重载,因此你看到System.Byte[], 0, 5因为调用ToString一个字节数组将产生一个System.Byte[],ToString表示的0IS 0,55和因此结果是 System.Byte[], 0, 5.

那么我们如何确保我们调用接受a startIndexcount?的版本?

如果你想调用这个Join方法的重载,并且你拥有的数组不是a,string[]那么你需要将数组的元素转换为字符串数组,例如:

Console.WriteLine(string.Format("0 - 5 byteArr: {0}", 
     string.Join(", ", byteArr.Select(b => b.ToString()).ToArray(), 0, 5)));
Run Code Online (Sandbox Code Playgroud)

通过执行byteArr.Select(b => b.ToString()).ToArray()我们确保我们使用startIndexcount参数调用重载.