2012-03-23 2 views
0

Почему, когда table.Count = 1 функции итерации таблицы получают более 1 пары ключ-значение? И если это особенность, как я могу ожидать поведения?HashMultiMap сохранить повторяющиеся привязки клавиш на фоне?

// 
      let table = new HashMultiMap<string, int> (HashIdentity.Structural) 
      table.Add("a", 1) 
      table.Add("a", 1) 
      table.Add("a", 1) 
      // now table.Count is one 
      let reduced = table.Fold (fun k v acc -> (k,v) :: acc) [] 
      let acc = ref [] 
      table.Iterate (fun k v -> acc.contents <- (k,v) :: acc.contents) 
      // 

уменьшенных и acc.contents содержит три ("A", 1) пара

ответ

1

документацию для Count члена говорит:

Общее количество ключей в таблице хэша

Если у вас есть несколько значений, связанных с одним и тем же ключом, все еще остается только одна клавиша, поэтому значение 1 является ожидаемым результатом для ваш пример. Насколько я могу видеть, что нет никакой собственности, которая возвращает общее число значений, но вы можете осуществить это легко с помощью Fold:

let valueCount = table.Fold (fun _ _ n -> n + 1) 0 
+0

Я надеялся, что один ключ может быть связан только с одним значением. Итак, это нормальное поведение, когда на самом деле ключом является множество привязок? – psct

+2

@psct Если вы используете 'HashMultiMap', то один ключ может быть связан с несколькими значениями (поэтому он называется' Multi'). Если вы хотите связать одно значение с ключом, вы можете использовать обычный F # неизменяемый «Map» или измененный .NET-словарь. –

Смежные вопросы