Cours VB.
NET par Philippe Lasserre
On peut créer une collection générique (System.Collections.Generic) et lui imposer un type.
Exemple: créons une collection de String (List(Of String)): Elle est typée car elle ne peut contenir que des 'String'.
Dim l As New List(Of String)
Il s'agit d'une List avec Index.
l.Add("toto") 'On ajoute une string
Dim S As String = l.Item(0) ' l'item est bien typé : même avec 'Option Strict=on'
'pas besoin de CType.
Il y a aussi de nouveaux types de collections génériques
-Les Dictionnary(Of..) avec Clé et valeur
-Les SortedDictionnary(Of..) avec Clé et valeur trié.
-Les LinkedList(Of..) Liste Chaînée, chaque élément comportant une propriété Value, Next et Previous.
-Les SortedList(Of..)..
-Les Stack(Of..)
-Les Queue(Of..)
On peut aussi créer des collections 'composées'.
Dim genericColl As New Dictionary(Of String, String)
genericColl.Add("PremiereClé", item1)
V-Y - Linq
'Language-Integrated Query' (LINQ), veut dire "langage de requête intégré".
On l'utilise dans VB à partir de VB2008 (Framework 3.5).
V-Y-1 - Définition, mise en place
C'est un langage de requêtes (permettant d'interroger une source de données) directement dans le code Visual Basic
et à l'aide de mots clés familiers (issues du SQL, le langage d'interrogation des bases de données).
Cette source de données peut être une Base de données (Linq To SQL et Linq To DataSet )un fichier XML (Link To
XML) mais aussi une collection, un tableau, une chaîne de caractères.
On parle dans ce dernier cas de 'Linq To Objects'. Si un objet prend en charge l'interface IEnumerable ou
IEnumerable (Of), le fournisseur LINQ to Objects vous permet de l'interroger.
LINQ (dixit Microsoft) offrent trois principaux avantages par rapport aux boucles for Each traditionnelles :
- 351 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation
de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © - . Aucune reproduction, même partielle, ne peut
être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez
selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://plasserre.developpez.com/cours/vb-net/
Cours VB.NET par Philippe Lasserre
Les requêtes:
-Elles sont plus concises et lisibles, surtout lors du filtrage de plusieurs conditions.
-Elles fournissent des fonctions puissantes de filtrage, de classement et de regroupement avec un minimum de code
d'application.
-Elles peuvent être appliquées à d'autres sources de données avec peu ou pas de changement.
Pour que LINQ soit pris en compte il faut:
Utiliser VB 2008 et le framework 3.5.
Dans les propriétés, onglet compile, il faut que Option Infer=On
Il faut ajouter System.Data.Linq:
Si vous créez un nouveau projet dans VB 2008, toutes les conditions sont effectives par défaut, si vous modifiez un
ancien projet, il faut rajouter certaines références:
Dans l'Explorateur de solutions (Projet, Propriétés..), cliquez sur Références, puis cliquez sur Ajouter une référence.
Cliquez sur .NET, sur l'assembly System.Data.Linq, puis sur OK, cela ajoute la référence.
Il faut ajouter l'espace de nom:
Dans l'explorateur de solution cocher Systel.Data.Link comme ci-dessus
ou ajouter les directives suivantes en haut du Module1 :Imports System.Data.Linq
- 352 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation
de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © - . Aucune reproduction, même partielle, ne peut
être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez
selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://plasserre.developpez.com/cours/vb-net/
Cours VB.NET par Philippe Lasserre
V-Y-2 - Principe d'une requête Linq
A titre d'exemple simpliste, on a des données dans MyData et chaque donnée a les champs 'Nom', "Prenom", "Ville"...
Comment chercher les enregistrements ayant comme nom "toto"?
Dim Resultat = From Element In MyData _
Where Element.Nom = "Toto" _
Select Element
On crée une variable de requête (ici ' Dim Resultat') qui sera chargée de contenir la requête (et pas les résultats),
puis l'expression de requête composée de:
From : dans quoi chercher? dans quel élément?
In : quelle source de données? dans MyData.
Where : précise les conditions à appliquer, c'est le 'filtre'.
Select: Précise les éléments à extraire qui vont apparaître dans 'Resultat'
Remarquons que Dim From In Where Select doivent être sur une seule unique et même ligne; pour la lisibilité, on
écrit sur plusieurs lignes en ajoutant des continuateurs de lignes " _".
Remarquons aussi qu'initialement on connaît MyData et on sait que chaque élément de MyData a un champ 'Nom',
c'est tout!! On utilise dans la requête les nouvelles variables 'Resultat' et 'Element' sans avoir à déclarer leurs types
(on aurait pu le faire). 'Element' est une variable de portée déduite comme élément de MyData.
Ce fonctionnement particulier de LINQ est possible grâce à l'inférence de type et aux types anonymes (voir plus bas).
Et pour afficher les noms dans une ListBox:
For Each P In Resultat
ListBox1.Items.Add(P.NOM )
Next
Ici la requête contenue dans la variable de requête 'Resultat' est exécutée pour 'alimenter' la boucle 'For Each'.
On remarque donc que l'exécution est différée.
On peut 'forcer' l'exécution immédiate en mettant la requête entre parenthèses et en utilisant une propriété
(.Count , .ToArray, .ToList ):
' Execution immédiate avec ToList.
Dim ListPersonneAyantPrenomToto = (From Element In MyData _
Where Element.Nom = "Toto" _
Select Element).ToList()
' On retrouve la liste des eléments de MyData ayant le Prenom='Toto"
- 353 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation
de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © - . Aucune reproduction, même partielle, ne peut
être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez
selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://plasserre.developpez.com/cours/vb-net/
Cours VB.NET par Philippe Lasserre
' Execution immédiate avec Count.
Dim NombrePersonneAyantPrenomToto = (From Element In MyData _
Where Element.Nom = "Toto").Count()
' On a compté le nombre d'élément ayant pour Prenom="Toto".
'NombrePersonneAyantPrenomToto contient le résultat
On peut aussi utiliser .ToList ou .ToArray en mode différé:
' Execution différée .
Dim Resultat = From Element In MyData _
Where Element.Nom = "Toto" _
Select Element
' . . .
Dim Tableau = Resultat.ToArray()
Order By permet de trier les résultats.
Dim Resultat = From Element In MyData _
Order By Element.Price Descending, Element.Nom _
Select Element.Nom, Element.Price
Ici on trie par prix décroissant, puis à prix égal sur le nom croissant.
Remarquons qu'on sélectionne seulement 2 'colonnes'.
Il est possible d'avoir plusieurs sources, dans ce cas chaque bloc .In est séparé par une virgule:
Dim queryResults = From cust In customers, ord In orders _
Where cust.CustomerID = ord.CustomerID _
Select cust, ord
La clause Where peut contenir des conditions complexes avec des AND des OR..
Dim custs = From cust In db.Customers _
Where cust.Country = "France" _
And (cust.CompanyName.StartsWith("F") _
Or cust.CompanyName.StartsWith("V")) _
Order By cust.CompanyName _
Select cust.CompanyName, cust.City
DataGridView1.DataSource = custs
V-Y-3 - Link et les tableaux d'Integers
Un tableau peut être interrogé par Linq.
Exemple: rechercher les nombres pairs dans un tableau d'Integer :
- 354 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation
de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © - . Aucune reproduction, même partielle, ne peut
être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez
selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://plasserre.developpez.com/cours/vb-net/
Cours VB.NET par Philippe Lasserre
' La Data source: c'est un tableau d'Integer
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}
' Création de la requête.
'Pour chaque élément num dans la source
'Si l'élément num est tel que num Mod 2=0 (condition pour qu'il soit pair)
'Selectionner num et le mettre dans réponses
Dim réponses = From num In numbers _
Where num Mod 2 = 0 _
Select num
' Exécution de la requête.
' On utilise les réponses
For Each number In réponses
Console.Write(number & " ")
Next
Cela affiche sur la console(menu Affichage puis Sortie): 0 2 4 6
On peut vouloir compter uniquement les nombres pairs:
Dim nombredepair = (From num In numbers _
Where num Mod 2 = 0 _
Select num).Count()
Console.Write(nombrepair) 'pour afficher 4
On remarque que dans le premier exemple (Select num) l'exécution de la requête est effectuée au cours de la boucle
For Each (exécution différée par rapport à la création) alors que dans le second exemple (count) , l'exécution est
immédiate.
V-Y-4 - Link et les chaînes de caractères
Soit une chaîne de caractères MyString, rechercher les caractères qui sont des nombres.
' Un string
Dim MyString As String = "ABCjkjhkhs666KMOOP"
' Select les caractères qui sont des nombres
Dim Query = From ch In MyString _
Where ch.IsDigit(ch) _
Select ch
- 355 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation
de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © - . Aucune reproduction, même partielle, ne peut
être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez
selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://plasserre.developpez.com/cours/vb-net/
Cours VB.NET par Philippe Lasserre
' Exécution de la requête
For Each c As Char In Query
Console.Write(c & " ")
Next
' Combien y a t-il de nombres?
Dim count As Integer = Query.Count()
Console.WriteLine("Count = " & count)
On remarque qu'il n'est pas nécessaire de réexecuter la requête.
Autre syntaxe:
Sélectionner tous les caractères avant '6'
Dim Query2 = MyString.TakeWhile(Function(c) c <> "6")
' Execute the second query
For Each ch In Query2
Console.Write(ch)
Next
Ici on a utilisé TakeWhile qui sélectionne les caractères jusqu'à 6. (les sélectionne une seule fois). On a utilisé une
expression lambda (voir le chapitre sur les expressions lambdas).
Dim Query2 = MyString.Except("6")
Ici on a utilisé Except qui sélectionne les caractères sauf 6.
V-Y-5 - Link et les mots d'une chaîne de caractères
Rechercher combien de fois une String contient le mot 'Basic':
Dim text As String = "Ceci est un cours Visual Basic" & _
" pour les débutants et les autres"
Dim searchTerm As String = "Basic"
' Conversion de la String en Tableau de mots:.
Dim dataSource As String() = text.Split(New Char() {" ", ",", ".", ";", ":"}, _
StringSplitOptions.RemoveEmptyEntries)
' Création et exécution de la requête
' Utiliser ToLower pour trouver "Basic " et "Basic"
Dim Query = From word In dataSource _
Where word.ToLowerInvariant() = searchTerm.ToLowerInvariant() _
Select word
' Compter les 'Basic'.
Dim count As Integer = Query.Count()
Console.WriteLine(count )
- 356 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation
de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © - . Aucune reproduction, même partielle, ne peut
être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez
selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://plasserre.developpez.com/cours/vb-net/
Cours VB.NET par Philippe Lasserre
V-Y-6 - Link pour rechercher la différence entre deux listes de noms
Rechercher dans la String nom1, les noms qui ne sont pas aussi dans nom2.
' Soit 2 tableaux de Sting
Dim nom1 As String() = {"Philippe", "Paul"}
Dim nom2 As String() = {"Paul", "Jean"}
' Créer la requête.
Dim difference = nom1.Except(nom2)
' Executer
For Each name As String In difference
Console.WriteLine(name)
Next
Affiche 'Philippe'
V-Y-7 - Link et les contrôles
Comment obtenir la liste des contrôles actifs dans un formulaire?
Dim ControlsEnabled = _
From c In Me.Controls _
Where CType(c, Control).Enabled _
Select CType(c, Control)
On se rend bien compte que, ici, Linq est une alternative à For Each.
V-Y-8 - Inference de Type et type anonyme
Débutant, tu peux sauter!!
On a vu que Linq fonctionnait d'une manière un peu particulière. Pour mieux comprendre cela, il faut savoir qu'à partir
de VB 2008 on peut utiliser l'inférence de type et les types anonymes.
Inférence de Type
Il faut pour cela que Option Infer =On (Off par défaut)
Passer par le menu 'Projet' puis 'Propriétés de..', onglet 'Compiler'
En plus des options Explicit, Compare, Strict, on peut modifier Option Infer.
L'inférence est la capacité de déduire le type d'une variable par analyse des types fournis en entrées ainsi
que des opérations effectuées sur ceux-ci. C'est donc le compilateur qui déduit le type de la variable.
- 357 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation
de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © - . Aucune reproduction, même partielle, ne peut
être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez
selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://plasserre.developpez.com/cours/vb-net/