【问题标题】:Using Take() to grab bytes out of a byte array, having trouble converting back to byte[] after the Take()使用 Take() 从字节数组中抓取字节,在 Take() 之后无法转换回 byte[]
【发布时间】:2016-08-05 15:39:32
【问题描述】:
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# 新手,不知道该怎么做。

【问题讨论】:

    标签: c# take


    【解决方案1】:

    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();
    

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

    【讨论】:

    • 感谢您的帮助!你能解释一下为什么你的有效而我的无效吗?
    • @MrDysprosium 我会更详细地更新我的答案。
    【解决方案2】:

    您的代码给出错误的原因是因为.Take(result) 返回一个IEnumerable&lt;byte&gt; 类型并且您试图将它分配给byte[] 数组。 .Take()LINQ 方法,这通常是所有 LINQ 方法为了链接而工作的方式(例如 result.Skip(5).Take(10))。

    .ToArray() 方法采用IEnumerable&lt;T&gt; 结果并将其转换为T[]。因此,将.ToArray() 添加到您的行将解决您的问题:

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

    与使用 .Take() 然后创建另一个数组不同,您可能会发现它的性能更高:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 2014-02-02
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      相关资源
      最近更新 更多