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

以上失败就result.Take(255);行了。它说我无法转换IEnumerablebyte[],并询问我是否缺少演员表。

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

4

2 回答 2

7

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

在此处输入图像描述

这不是一个数组,所以你不能将它分配给一个字节数组的引用。但是,使用 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();

...因为这是他们真正的共同点。

于 2016-08-05T15:40:46.760 回答
1

您的代码给出错误的原因是因为.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()不知道生成的数组需要多大,所以它必须选择一些相对较小的尺寸,并且随着更多的项目被读入,它必须调整大小以扩展容量。在数组大到足以存储所有项目之前,这可能会发生数十次,具体取决于项目的数量。

于 2016-08-05T15:46:26.687 回答