var r = from s in tempResult
select Encoding.GetEncoding("iso-8859-1").GetBytes(s);
我明白了,這將返回IEnumerable<byte[]>
,但我找LINQ的方式轉換成整個IEnumerable<byte[]>
到byte[]
。轉換IEnumerable的<byte[]>爲byte []
var r = from s in tempResult
select Encoding.GetEncoding("iso-8859-1").GetBytes(s);
我明白了,這將返回IEnumerable<byte[]>
,但我找LINQ的方式轉換成整個IEnumerable<byte[]>
到byte[]
。轉換IEnumerable的<byte[]>爲byte []
到目前爲止提供的答案都將無法工作,因爲他們將在IEnumerable<byte[]>
轉換爲byte[][]
。如果你的目標是把所有的陣列中的枚舉和產生一個大陣,試試這個:
byte[] result = r.SelectMany(i => i).ToArray();
請注意,這不是最有效的方法。將原始查詢結果轉換爲列表會更快,然後計算數組長度的總和。一旦完成,您可以立即分配最終數組,然後再對結果列表進行更多的傳遞,並將每個結果數組的內容複製到較大的數組中。
上面的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;
}
注意,無論枚舉傳遞將被枚舉兩次,所以這將是在傳遞一個好主意列表或數組而不是查詢,如果該查詢昂貴。
var r = (from s in tempResult
select Encoding.GetEncoding("iso-8859-1").GetBytes(s)
).ToArray();
ToArray
怎麼辦擴展方法?
byte[] array = r.SelectMany(a => a).ToArray();
您確定這就是您想要做的嗎?此代碼已經返回一個字節數組:
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);
所以你想「扁平化」那個序列。 IIRC,你應該可以使用LINQ的'SelectMany'操作符。 (我從不*確定它的工作原理,也許其他人會這樣做。) – stakx
@stackx:這真的很簡單。 'Select'需要一個'IEnumerable',一個'Func ',並使用該函數返回一個'IEnumerable '。 'SelectMany'接受一個'IEnumerable ',一個'Func >'並使用該函數返回'IEnumerable '。基本上,它將由函數產生的所有枚舉集合成一個枚舉類型,比如將'Concat()'依次應用於每個枚舉類型。(實際上,您可以將LINQ'Aggregate'函數與'Concat'結合起來以複製'SelectMany'的行爲。) –
cdhowie