2011-08-12 175 views
3
var r = from s in tempResult  
      select Encoding.GetEncoding("iso-8859-1").GetBytes(s); 

我明白了,这将返回IEnumerable<byte[]>,但我找LINQ的方式转换成整个IEnumerable<byte[]>byte[]转换IEnumerable的<byte[]>为byte []

+1

所以你想“扁平化”那个序列。 IIRC,你应该可以使用LINQ的'SelectMany'操作符。 (我从不*确定它的工作原理,也许其他人会这样做。) – stakx

+0

@stackx:这真的很简单。 'Select'需要一个'IEnumerable ',一个'Func ',并使用该函数返回一个'IEnumerable '。 'SelectMany'接受一个'IEnumerable ',一个'Func >'并使用该函数返回'IEnumerable '。基本上,它将由函数产生的所有枚举集合成一个枚举类型,比如将'Concat()'依次应用于每个枚举类型。(实际上,您可以将LINQ'Aggregate'函数与'Concat'结合起来以复制'SelectMany'的行为。) – cdhowie

回答

14

到目前为止提供的答案都将无法工作,因为他们将在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; 
} 

注意,无论枚举传递将被枚举两次,所以这将是在传递一个好主意列表或数组而不是查询,如果该查询昂贵。

+0

+1这是正确的,我的[编辑]答案错过了嵌套数组。 – JYelton

+0

@cdhowie:它的工作。我刚开始学习LINQ。所以一次只需一步。谢谢。 – Sandeep

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

ToArray怎么办扩展方法?

byte[] array = r.SelectMany(a => a).ToArray(); 
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); 
相关问题