F # итерация по словарю - PullRequest
9 голосов
/ 16 июля 2010

Я только начинаю с F # и хочу перебрать словарь, получая ключи и значения.

Так что в C # я бы поставил:

IDictionary resultSet = test.GetResults;
foreach (DictionaryEntry de in resultSet)
{
    Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
}

Кажется, я не могу найти способ сделать это в F # (в любом случае не тот, который компилируется).

Может кто-нибудь предложить аналогичный код в F #?

Приветствия

Давка

Ответы [ 3 ]

19 голосов
/ 16 июля 2010

Какой тип вашего словаря?

Если это не универсальный IDictionary, как предполагает ваш фрагмент кода, попробуйте следующее (В F # for не вставляет неявно преобразования, поэтому вам нужно добавить Seq.cast<>, чтобы получить типизированную коллекцию Вы можете легко работать с):

for entry in dict |> Seq.cast<DictionaryEntry> do
  // use 'entry.Value' and 'entry.Key' here

Если вы используете универсальный IDictionary<'K, 'V>, то вам не нужен вызов Seq.cast (если у вас есть какой-либо контроль над библиотекой, это лучше, чем предыдущий вариант):

for entry in dict do
  // use 'entry.Value' and 'entry.Key' here

Если вы используете неизменный тип F # Map<'K, 'V> (который лучше всего использовать, если вы пишете функциональный код на F #), то вы можете использовать решение Павла или цикл for вместе с KeyValue активный шаблон, подобный этому:

for KeyValue(k, v) in dict do
  // 'k' is the key, 'v' is the value

В обоих случаях вы можете использовать либо for, либо различные iter функции. Если вам нужно выполнить что-то с побочными эффектами, то я бы предпочел цикл for (и это не первый ответ, где я упоминаю об этом :-)), потому что это языковая конструкция, предназначенная для этой цели. Для функциональной обработки вы можете использовать различные функции, такие как Seq.filter и т.д ..

2 голосов
/ 16 июля 2010
resultSet |> Map.iter (fun key value ->
   printf "Key = %A, Value = %A\n" key value)
0 голосов
/ 07 мая 2018

Если вы имеете дело с Map<K,V>, другой способ - преобразовать карту в F # list<K*V> через Map.toList yourMap, а затем выполнить итерацию (даже рекурсивно) через нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...