2013-12-15 3 views
1

Я сделал карту, которая включает в себя несколько словарей. Каждый раз, когда я получаю данные, я нахожу соответствующий словарь на Карте, а затем добавляю новую информацию в этот словарь. Но проблема в том, что каждый раз, когда я пытаюсь добавить информацию, она не будет добавлять ее только в соответствующий словарь, вместо этого она добавит ее во все словари на карте. , пожалуйста, я схожу с ума.F # error, включая словарь

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 
Смежные вопросы