Tout d'abord, je ne sais pas si vous avez besoin d'une boucle dans votre exemple du tout. Votre code renvoie toujours la valeur de la première ligne. Je vais compliquer un peu l'exemple et supposer que vous ne voudrez peut-être pas obtenir certains identifiants comme résultat (vous devrez peut-être faire une boucle). La méthode habituelle pour écrire des constructions en boucle dans les langages fonctionnels est d'utiliser la récursivité (dans de nombreux cas, vous pouvez éviter d'utiliser explicitement la récurrence, car il existe de nombreuses fonctions utiles d'ordre supérieur que vous pouvez utiliser directement). Dans ce cas, vous pouvez écrire une fonction récursive simple, read
qui appelle r.Read()
une fois - si elle réussit alors il renvoie l'ID, sinon, il s'appelle récursivement lire la ligne suivante:
let id =
(use r = command.ExecuteReader()
let rec read() =
if r.Read() then
let id = r.GetInt64(0)
if weWantThisId id then id // this is the ID we want
else read() // continue reading IDs
else 0 // default value/throw
read())
La fonction read
est écrit en tant que fonction locale dans une étendue qui initialise la valeur id
. Cela signifie que lorsque F # affecte une valeur à id
, il exécute ExecuteReader
, puis exécute la fonction locale read
(c'est une manière d'écrire l'initialisation en tant qu'expression unique). Bien sûr, il peut être plus facile à lire pour écrire une fonction fetchId
comme Jon suggère (en F #, vous utiliserez à nouveau récursivité):
let fetchId() =
use r = command.ExecuteReader()
let rec read() =
if r.Read() then
let id = r.GetInt64(0)
if weWantThisId id then id
else read()
else 0
read()
Qu'en est-il d'appeler Dispose sur 'r'? – Gabe
Il manquait une ligne dans le second extrait, ce qui a probablement causé de la confusion. Quoi qu'il en soit, j'utilise 'use', donc' r' sera automatiquement éliminé quand il est hors de portée (après avoir calculé l'ID dans le premier exemple ou après avoir retourné la fonction dans le second exemple). –
parfait, le premier exemple a répondu à ma question. En fait la raison pour laquelle mon code a une boucle et une rupture est bc il y a un si (cond) continue dedans et l'instruction cond (qui n'a pas de sens dans sa propre fonction). J'aime cette capacité à assigner des variables dans une instruction if qui a sa propre portée. –