加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 将IEnumerable转换为byte []

发布时间:2020-12-15 19:44:58 所属栏目:百科 来源:网络整理
导读:var r = from s in tempResult select Encoding.GetEncoding("iso-8859-1").GetBytes(s); 我明白了,这会返回IEnumerable byte [],但我正在寻找LINQ方式来转换整个IEnumerable byte []到byte []. 解决方法 到目前为止提供的答案都不起作用,因为它们将转换IEnu
var  r = from s in tempResult    
          select Encoding.GetEncoding("iso-8859-1").GetBytes(s);

我明白了,这会返回IEnumerable< byte []>,但我正在寻找LINQ方式来转换整个IEnumerable< byte []>到byte [].

解决方法

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

byte[] result = r.SelectMany(i => i).ToArray();

见this ideone example.

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

上面的LINQ查询肯定使这项任务变得简单,但它不会很快.如果此代码成为应用程序的瓶颈,请考虑以这种方式重写它.

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

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,joined,index,arr.Length);
            index += arr.Length;
        }

    return joined;
}

请注意,无论您传入的枚举是什么,都会被枚举两次,因此如果查询很昂贵,最好传入列表或数组而不是查询.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读