2011-08-12 257 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); 
相關問題