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#的新手,不确定该怎么做。
答案 0 :(得分: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();
...因为这是他们真正有共同点的一件事。
答案 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()
不知道生成的数组需要多大,所以它必须选择一些相对较小的大小,并且随着更多项被读入,它必须调整大小以扩展容量。在数组足够大以存储所有项目之前,这可能会发生数十次,具体取决于项目数。