2009-07-29 11 views
11

गूगल एक एफ # शब्दकोश (या अन्य संग्रह) में जोड़ने और प्रविष्टियों को हटाने का उदाहरण के बहुत सारे अर्जित करता है। लेकिन मैंआप एक शब्दकोश प्रविष्टि के मूल्यों को mutable के रूप में कैसे घोषित करते हैं?

myDict["Key"] = MyValue; 

के बराबर मैं

myDict.["Key"] <- MyValue 

की कोशिश की है करने के लिए उदाहरण नहीं दिख रहा है मैं भी

Dictionary<string, mutable string> 

रूप में अच्छी तरह के रूप में कई वेरिएंट पर शब्दकोश घोषित करने का प्रयास किया इस। हालांकि, मैं अभी तक सही संयोजन पर हिट नहीं है ... अगर यह एफ # में वास्तव में संभव है।

संपादित करें: अपमानजनक कोड नहीं है:

type Config(?fileName : string) = 
    let fileName = defaultArg fileName @"C:\path\myConfigs.ini" 

    static let settings = 
     dict[ "Setting1", "1"; 
       "Setting2", "2"; 
       "Debug", "0"; 
       "State", "Disarray";] 

    let settingRegex = new Regex(@"\s*(?<key>([^;#=]*[^;#= ]))\s*=\s*(?<value>([^;#]*[^;# ]))") 

    do File.ReadAllLines(fileName) 
     |> Seq.map(fun line -> settingRegex.Match(line)) 
     |> Seq.filter(fun mtch -> mtch.Success) 
     |> Seq.iter(fun mtch -> settings.[mtch.Groups.Item("key").Value] <- mtch.Groups.Item("value").Value) 

त्रुटि मैं हो रही है:

System.NotSupportedException: This value may not be mutated 
    at [email protected]_Item(K key, V value) 
    at <StartupCode$FSI_0036>[email protected](Match mtch) 
    at Microsoft.FSharp.Collections.SeqModule.iter[T](FastFunc`2 action, IEnumerable`1 sequence) 
    at FSI_0036.Utilities.Config..ctor(Option`1 fileName) 
    at <StartupCode$FSI_0041>[email protected]() 
stopped due to error 

उत्तर

24

च # दो सार्वजनिक साहचर्य डेटा संरचनाओं है:

की सबसे अधिक, परिवर्तनशील शब्दकोश के लिए उपयोग किया जाता है जो इसे विरासत में यह बीसीएल में उपस्थिति है और हुड के नीचे एक hashtable का उपयोग करता है कि है।

let dict = new System.Collections.Generic.Dictionary<string,int>() 
dict.["everything"] <- 42 

अन्य Map रूप में जाना जाता है और आम कार्यात्मक शैली, अपरिवर्तनीय और द्विआधारी पेड़ के साथ लागू किया है, है है।

कार्य है कि एक शब्दकोश बदल जाएगा करने के बजाय

, नक्शे संचालन जो एक नया नक्शा जो जो कुछ भी परिवर्तन का अनुरोध किया गया था का परिणाम है वापसी प्रदान करते हैं। कई मामलों में, हुड के तहत पूरे मानचित्र की पूरी तरह से नई प्रतिलिपि बनाने की आवश्यकता नहीं होती है, इसलिए उन हिस्सों को सामान्य रूप से साझा किया जा सकता है। उदाहरण के लिए:

let withDouglasAdams = Map.add "everything" 42 Map.empty 

मूल्य withDouglasAdams 42 करने के लिए "सब कुछ" के एक संघ के रूप में हमेशा के लिए रहेगा, इसलिए यदि आप बाद में कार्य करें:

let soLong = Map.remove "everything" withDouglasAdams 

फिर इस 'हटाने' का असर दिख रहा है केवल soLong मूल्य के माध्यम से।

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

हालांकि यह आपकी समस्या का स्रोत नहीं है।Dict 'ऑपरेटर' एक स्पष्टीकरण देता है जो IDictionary<K,T> कार्यान्वयन (इसके दस्तावेज़ीकरण में इसका संकेत नहीं दे रहा है)।

fslib-अतिरिक्त pervasives.fs से (नोट भी कुंजी पर विकल्प के उपयोग):

let dict l = 
    // Use a dictionary (this requires hashing and equality on the key type) 
    // Wrap keys in an Some(_) option in case they are null 
    // (when System.Collections.Generic.Dictionary fails). Sad but true. 
    let t = new Dictionary<Option<_>,_>(HashIdentity.Structural) 
    for (k,v) in l do 
     t.[Some(k)] <- v 
    let d = (t :> IDictionary<_,_>) 
    let c = (t :> ICollection<_>) 
    let ieg = (t :> IEnumerable<_>) 
    let ie = (t :> System.Collections.IEnumerable) 
    // Give a read-only view of the dictionary 
    { new IDictionary<'key, 'a> with 
      member s.Item 
       with get x = d.[Some(x)]    
       and set (x,v) = raise (NotSupportedException(
              "This value may not be mutated")) 
    ... 
+0

नहीं कर सकता, अनुसंधान साइट अपटाइम वास्तव में खराब है। यहां Google कैश लिंक अस्थायी रूप से http://209.85.229.132/search?q=cache:GGIlRD9kBnYJ:research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/fsharp.core/microsoft.fsharp है। collections.map.html + f% 23 + microsoft.fsharp.collections.map और cd = 1 और hl = en & ct = clnk और gl = uk – ShuggyCoUk

+3

ध्यान दें कि बाइनरी पेड़ में लुकअप ओ (लॉग n) है, ओ (एन लॉग एन) जैसा कि बताया गया है। – kvb

+0

ओओएस - टाइपो धन्यवाद – ShuggyCoUk

5

आपने क्या त्रुटि मिलता है? मैं निम्नलिखित की कोशिश की और यह ठीक संकलित

let map = new System.Collections.Generic.Dictionary<string,int>() 
map.["foo"] <- 42 

संपादित सत्यापित करें कि यह कोड ठीक रूप में अच्छी तरह भाग गया।

+0

दिलचस्प ... मैं सिर्फ नक्शा किया [ "foo"] <-। 42 ;; मानचित्र। ["Foo"] <- 43 ;; ठीक – telesphore4

+0

शायद यह कुछ और है ... मैं पोस्ट हटा दूंगा लेकिन मैं – telesphore4

संबंधित मुद्दे

 संबंधित मुद्दे