2013-12-15 46 views
1

我製作了包含多個字典的地圖。每次我收到一個數據,我都會在Map中找到相應的字典,然後在這個字典中添加新的信息。 但問題是我每次嘗試添加信息時,都不會將其僅添加到相應的字典中,而是會將其添加到地圖中的所有字典中。 拜託,我變得瘋了。F#錯誤,包含字典的地圖

while datareceive do 
    let refdictionary = ref totalmap.[index] //totalmap has a lot of Dictionary, which is indexed by "index" 
    let dictionnarydata = totalmap.[index] 
    if dictionnarydata.ContainsKey(key1) then 
      ........ 
     else 
      refdic.Value.Add(key1,num) //if the corresponding dictionary does not have such information, then add it in it 
      () 
+1

你確定你實際上有幾個不同的字典,而不只是幾個引用到你的地圖中的同一個字典? – alun

回答

4

正如評論所說,如果你正在學習函數式編程,那麼最好的方法是使用一成不變的數據結構 - 在這裏,你可以使用一個地圖,該指數映射到一個嵌套映射(其中包含您需要的關鍵價值信息)。

嘗試用類似下面的示例播放:

// Add new item (key, num pair) to the map at the specified index 
// Since totalMap is immutable, this returns a new map! 
let addData index (key:int) (num:int) (totalmap:Map<_, Map<_, _>>) = 
    // We are assuming that the value for index is defined 
    let atIndex = totalmap.[index] 
    let newAtIndex = 
    // Ignore information if it is already there, otherwise add 
    if atIndex.ContainsKey key then atIndex 
    else atIndex.Add(key, num) 
    // Using the fact that Add replaces existing items, we 
    // can just add new map in place of the old one 
    totalmap.Add(index, newAtIndex) 

使用上述功能,您現在可以創建初始地圖,然後添加各種信息吧:

// Create an int-indexed map containing empty maps as values 
let totalmap = Map.ofSeq [ for i in 0 .. 10 -> i, Map.empty ] 
totalmap 
|> addData 0 1 42 
|> addData 0 1 32 
|> addData 1 10 1