2012-06-16 15 views
8

सी # में और जावा में गतिशील आकार के साथ एक बाइट सरणी बनाएँ बाइट सरणी इसएफ #

byte[] b = new byte[x]; 

जहां x सरणी के आकार दर्शाती है की तरह बनाया जा सकता है। मैं क्या करना चाहता हूं एफ # में एक ही काम करना है। मैंने यह खोजा है कि इसे कैसे किया जाए और दस्तावेज़ीकरण में इसकी तलाश की जाए। मुझे लगता है कि मैं शायद गलत खोज शब्दों का उपयोग कर रहा हूं क्योंकि मुझे पता नहीं चला कि कैसे।

मैं अब तक क्या पाया है कि Array.create इस तरह इस्तेमाल किया जा सकता है:

let b = Array.create x (new Byte()) 

वहाँ एक और तरीका है जो जिस तरह से यह सी # और जावा में किया जा सकता है के लिए और अधिक समान है यह करने के लिए है?

उत्तर

5

मुझे लगता है कि आप एक गैर-आरंभिकृत सरणी बना सकते हैं और इसे बाद में भरने के लिए चाहते हो जाएगा:

let arr = Array.zeroCreate 10 
for i in 0..9 do 
    arr.[i] <- byte(i*i) 

यह जिस तरह से आप सामान्य रूप से सी #/जावा, जो एफ # में unidiomatic है में क्या है। इसके बारे में सोचो; यदि आप कुछ तत्वों को प्रारंभ करना भूल जाते हैं, तो आपको null दुःस्वप्न से निपटना होगा।

लगभग सभी मामलों में, आप हमेशा Array module या सरणी समझ से उच्च आदेश कार्यों द्वारा उपरोक्त प्रक्रिया की जगह ले सकता:

let arr = Array.init 10 (fun i -> byte(i*i)) 

या

let arr = [| for i in 0..9 do -> byte(i*i)|] 

this MSDN page पर एक नजर डालें; इसमें एफ # में ऐरे का उपयोग करने के बारे में उपयोगी जानकारी है।

+3

क्या "शून्य" दुःस्वप्न "? जावा और सी # दोनों एक बाइट सरणी के तत्वों को मूल्य 0 के साथ बाइट्स पर स्पष्ट रूप से प्रारंभ करते हैं। –

+2

मेरा मतलब सामान्य रूप से ऑब्जेक्ट्स के साथ 'Array.zeroCreate' का उपयोग करना था। इस विशिष्ट मामले में कोई समस्या नहीं है। – pad

-1

आपका क्या मतलब है?

एफ # एक वाक्य रचना जावासी # और से अलग है, तो आप Array मॉड्यूल का उपयोग कर रहे उसे एक प्रारंभकर्ता साथ एक सरणी बनाने की क्षमता है। कुछ भी अजीब बात नहीं है, एक भाषा कार्यात्मक है जबकि दूसरा अनिवार्य है इसलिए इन मतभेदों की वास्तव में आवश्यकता है।

एफ # भाषा चश्मा आप कुछ है कि अप्रारंभीकृत है की घोषणा नहीं कर सकते हैं के अनुसार, इसका कारण यही है (Option प्रकार जो सिर्फ कारनामे है कि आप वास्तव में इसे बिना अप्रारंभीकृत अवधारणा व्यक्त करने के लिए अनुमति देते हैं के रूप में विशिष्ट पैटर्न का उपयोग कर जब तक) आपको सरणी में तत्वों के लिए प्रारंभकर्ता पास करना होगा।

+1

"* एफ # भाषा चश्मा आप कुछ है कि अप्रारंभीकृत है * की घोषणा नहीं कर सकते हैं के अनुसार" एह, 'Unchecked.defaultof <>' और 'Array.zeroCreate' आप के साथ एक शब्द करना चाहते हैं .. – ildjarn

+1

यह आपको एक ऐसी भाषा का शोषण करने के लिए एक चेतावनी है जिसका उपयोग इस तरह से नहीं किया जाना है। 'Unchecked.defaultof '.NET ढांचे के साथ अंतःक्रियाशीलता के लिए आवश्यक' शून्य 'मान है, आपको इसे कभी भी उपयोग नहीं करना चाहिए, क्योंकि यह एक कार्यात्मक भाषा में अनावश्यक होना चाहिए। तथ्य यह है कि कानूनी है इसका मतलब यह नहीं है कि भाषा दर्शन द्वारा सुझाया गया है या डिजाइन किया गया है। – Jack

+1

"कर सकते हैं" और "नहीं कर सकते" के बीच एक अंतर है। – ildjarn

7

एक करीबी एफ # अनुरूप होगा Array.zeroCreate:

let b: byte [] = Array.zeroCreate x 

पर जावा और सी # प्लेटफार्मों एफ # 0 बाइट्स निहित सरणी तत्वों प्रारंभ करने के बजाय स्पष्ट सरणी तत्वों की प्रारंभिक मूल्य बनाता है।

के रूप में एफ # में b की dynamic size के लिए यह आवंटन पर x मूल्य से एक बार परिभाषित किया गया है और इसी के लिए सी #/जावा x बदलकर बाद में बदला नहीं जा सकता है, ,.