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

时间:2011-08-12 18:01:27

标签: c# linq

 var  r = from s in tempResult    
          select Encoding.GetEncoding("iso-8859-1").GetBytes(s);

我理解,这会返回IEnumerable<byte[]>,但我会寻找LINQ方式将整个IEnumerable<byte[]>转换为byte[]

4 个答案:

答案 0 :(得分:16)

目前为止提供的答案都不起作用,因为它们会将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, 0, joined, index, arr.Length);
            index += arr.Length;
        }

    return joined;
}

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

答案 1 :(得分:1)

var  r = (from s in tempResult
          select Encoding.GetEncoding("iso-8859-1").GetBytes(s)
         ).ToArray();

答案 2 :(得分:1)

ToArray扩展方法怎么样?

byte[] array = r.SelectMany(a => a).ToArray();

答案 3 :(得分:1)

你确定这是你想做的吗?此代码已返回一个字节数组:

Encoding.GetEncoding("iso-8859-1").GetBytes(s);

在任何情况下,如果你想将枚举转换为数组,你可以这样做:

var myArray = (from s in tempResult    
               select Encoding.GetEncoding("iso-8859-1").GetBytes(s)).ToArray();

修改

编辑完成后,我发现我误解了你要完成的任务。如果我现在理解正确,你是否试图在tempResult中获得包含连接字符串的字节数组?我会这样:

var concatenated = String.Join("", tempResult.ToArray());    
var byteArray = Encoding.GetEncoding("iso-8859-1").GetBytes(concatenated);