listOfByteArrs.SelectMany(byteArr=>byteArr).ToArray()
ऊपर कोड एक अनुक्रम में बाइट्स की दृश्यों के एक दृश्य को श्रेणीबद्ध - और एक सरणी में परिणाम की दुकान। नहीं तथ्य का इस्तेमाल कर रही है कि आप पहले से ही परिणामी बाइट सरणी की लंबाई को जानते हैं और इस प्रकार गतिशील बढ़ाया .ToArray()
कार्यान्वयन जरूरी है कि एक से अधिक आवंटन शामिल है से बच सकते हैं और array- यह -
हालांकि पठनीय, यह अधिकतम कुशल है प्रतियां। इसके अलावा, SelectMany
इटरेटर के संदर्भ में लागू किया गया है; इसका मतलब है बहुत सारे इंटरफ़ेस कॉल जो बहुत धीमी है। हालांकि, छोटे-आश डेटा-सेट आकारों के लिए यह मामला असंभव है।
हैं आप एक तेजी से कार्यान्वयन की जरूरत है तो आप निम्न कर सकते हैं:
var output = new byte[listOfByteArrs.Sum(arr=>arr.Length)];
int writeIdx=0;
foreach(var byteArr in listOfByteArrs) {
byteArr.CopyTo(output, writeIdx);
writeIdx += byteArr.Length;
}
या Martinho पता चलता है के रूप में:
var output = new byte[listOfByteArrs.Sum(arr => arr.Length)];
using(var stream = new MemoryStream(output))
foreach (var bytes in listOfByteArrs)
stream.Write(bytes, 0, bytes.Length);
कुछ समय:
var listOfByteArrs = Enumerable.Range(1,1000)
.Select(i=>Enumerable.Range(0,i).Select(x=>(byte)x).ToArray()).ToList();
कम का उपयोग करना इन 500500 बाइट्स को संयोजित करने की विधि एफए का उपयोग करके 15 एमएमएस लेती है सेंट विधि मेरी मशीन पर 0.5 मिमी लेती है - वाईएमएमवी, और ध्यान दें कि कई अनुप्रयोगों के लिए दोनों पर्याप्त तेज़ से अधिक हैं ;-)।
अंत में, आप static
Array.Copy
, निम्न स्तर के Buffer.BlockCopy
, या एक वापस पूर्व आबंटित बफर के साथ एक MemoryStream
साथ Array.CopyTo
की जगह सकता है - इन सभी मेरी परीक्षण (64 .NET 4.0) पर काफी हूबहू प्रदर्शन करते हैं।
स्रोत
2011-02-02 15:05:44
हालांकि छोटे और स्पष्ट, ध्यान दें कि पारंपरिक समाधान की तुलना में यह कोड बहुत धीमा है। यदि यह काफी तेज़ है, तो बढ़िया है, लेकिन यह पर्याप्त तेज़ नहीं हो सकता है। –
"पारंपरिक समाधान" कौन सा है? – amalgamate
"परंपरागत" समाधान शायद मैनुअल होगा, लूप के लिए घोंसला। ब्लॉक-कॉपी आधारित समाधानों की तुलना में यह लगभग तीन गुना धीमा है, लेकिन अभी भी 'SelectMany' से 10 गुना तेज है। –