使用Take()从字节数组中获取字节,在Take()之后转换回byte []时遇到问题

时间:2016-08-05 15:39:33

标签: c# take

byte[] result = memStream.ToArray();                              
memStream.Close();
byte[] temp = result.Take(255);
var str = System.Text.Encoding.Default.GetString(temp);

以上result.Take(255);行失败。它说我无法将IEnumerable转换为byte[],并询问我是否错过了演员。

我是C#的新手,不确定该怎么做。

2 个答案:

答案 0 :(得分:7)

Take()返回枚举时执行的枚举器对象:

enter image description here

这不是数组,因此您无法将其分配给字节数组的引用。但是,使用LINQ,您可以通过调用其ToArray()方法获取任何序列并转换为适当类型的数组:

byte[] temp = result.Take(255).ToArray();

ToArray()枚举Take(255)的结果,将结果放入一个新数组,然后返回数组。

这有点令人困惑,因为你可以枚举一个数组,就像你可以枚举从Take(255)得到的东西 - 但你可以枚举很多东西。这只是他们共同的一种行为,但它们实际上是非常不同的对象。

您可以将其中一个指定给IEnumerable<byte>

IEnumerable<byte> a = result.Take(255);
IEnumerable<byte> b = result.Take(255).ToArray();

...因为这是他们真正有共同点的一件事。

答案 1 :(得分:0)

您的代码出错的原因是.Take(result)返回IEnumerable<byte>类型,并且您尝试将其分配给byte[]数组。 .Take()LINQ方法,这通常是所有LINQ方法用于链接的方式(例如result.Skip(5).Take(10))。

.ToArray()方法获得IEnumerable<T>结果并将其转换为T[]。因此,在您的行中添加.ToArray()可以解决您的问题:

byte[] temp = result.Take(255).ToArray();

不是使用.Take()然后再创建另一个数组,您可能会发现这更高效:

byte[] temp = new byte[255]
Array.Copy(result, temp, 255);

原因是因为.ToArray()不知道生成的数组需要多大,所以它必须选择一些相对较小的大小,并且随着更多项被读入,它必须调整大小以扩展容量。在数组足够大以存储所有项目之前,这可能会发生数十次,具体取决于项目数。