首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将IEnumerable< byte[] >转换为byte[]

将IEnumerable< byte[] >转换为byte[]
EN

Stack Overflow用户
提问于 2011-08-13 02:01:27
回答 4查看 12.4K关注 0票数 6
代码语言:javascript
复制
 var  r = from s in tempResult    
          select Encoding.GetEncoding("iso-8859-1").GetBytes(s);

我明白,这会返回IEnumerable<byte[]>,但是我在寻找LINQ的方法来将整个IEnumerable<byte[]>转换成byte[]

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-13 02:05:39

到目前为止,提供的答案都不起作用,因为它们会将IEnumerable<byte[]>转换为byte[][]。如果您的目标是获取enumerable中的所有数组并生成一个大数组,请尝试以下方法:

代码语言:javascript
复制
byte[] result = r.SelectMany(i => i).ToArray();

参见this ideone example

请注意,这不是最有效的方法。将原始查询结果转换为列表,然后计算数组长度之和会更快。完成后,您可以立即分配最终的数组,然后在结果列表上再进行一次遍历,并将每个结果数组的内容复制到更大的数组中。

上面的LINQ查询无疑使这项任务变得容易,但它不会很快。如果此代码成为应用程序中的瓶颈,请考虑以这种方式重写它。

我不妨提供一个更有效的实现的例子:

代码语言:javascript
复制
public static T[] JoinArrays<T>(this IEnumerable<T[]> self)
{
    if (self == null)
        throw new ArgumentNullException("self");

    int count = 0;

    foreach (var arr in self)
        if (arr != null)
            count += arr.Length;

    var joined = new T[count];

    int index = 0;

    foreach (var arr in self)
        if (arr != null)
        {
            Array.Copy(arr, 0, joined, index, arr.Length);
            index += arr.Length;
        }

    return joined;
}

请注意,您传入的任何可枚举值都将被枚举两次,因此,如果查询开销很大,那么传入列表或数组而不是查询将是一个好主意。

票数 18
EN

Stack Overflow用户

发布于 2011-08-13 02:02:52

代码语言:javascript
复制
var  r = (from s in tempResult
          select Encoding.GetEncoding("iso-8859-1").GetBytes(s)
         ).ToArray();
票数 1
EN

Stack Overflow用户

发布于 2011-08-13 02:03:19

那么ToArray扩展方法呢?

代码语言:javascript
复制
byte[] array = r.SelectMany(a => a).ToArray();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7044358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档