Feb.07

MacroSeb.GenererProprietes()

Je vous présente ma petite macro pour VS 2005 que j’ai ecris la semaine derniere en cours de prog. evenementielle avec Rédo!
Elle permet très rapidement de créer des propriètes (champs et accesseurs associés) en VB.net ou C# (detection automatique !). Une petite approche de la RAD de type bruteforce ^^

Exemple en C#:

J’écris dans mon fichier source:

J’execute ma macro, et elle me remplace le tout par :

Ce qui me fait gagner énormement de temps dans mes developpements… Et elle le fait aussi bien en VB.net (elle detecte au préalable l’extention du fichier source ! « .cs » = code c# ou « .vb » = code VB)

Niveau code, rien de bien compliqué, moins de 150lignes, elle commence par récupérer l’extention du fichier pour choisir le langage à generer en sortie, puis elle enregistre dans un tableau a 2 dimensions le nom de la propriete et son type, elle efface tout puis ecrit dans le bon langage, les champs (privés) et les accesseurs (get/set public).

A noter: pour que la macro fonctionne, vous devez ecrire une seule propriete par ligne de la facon suivante : <nom> <type> (ex: nom string)

Télécharger la macro ici

Perso,Dev,.NET

Feb.05

Un escargot dans une matrice !!!

Titre un peu surprenant je vous l’accorde 🙂

Dans le cadre de mon projet SimImmuno II, j’ai besoin de connaître quelles sont les cellules qui avoisine une cellule donnée. Pour cela, chaque cellule est placée dans une matrice (tableau à deux dimensions !).

Le but de l’algorithme est de parcourir cette matrice à partir d’un point donnée (la position de la cellule) en tournant autour comme un escargot.

Petit exemple illustré :

Pour ne penser qu’à l’algorithme oublions les histoires de cellule. Prenons un tableau de 100×100 avec un point de référence aux coordonnées 50;50.

Nous voulons juste récupérer les coordonnées des positions autour de notre point de référence qu’empruntera notre escargot (Il suffira après de tester si aux coordonnées visitées il y a ou pas la présence d’une cellule).

Dans notre cas, les coordonnées à visiter sont : 50;49, 51;49, 51;50, 51;51, 50;51, 49;51, 49;50, 49;49, etc…

Si l’on illustre ça par le schéma :

On peut observer que l’on avance de x cases suivant notre avancement par multiple de 2 : 2 fois 1case, 2fois 2cases, 2fois 3cases, 2fois 4 cases, etc… L’on appellera cela le nombre de pas qui s’incrémentera tous les 2 avancement. Puis l’on « tourne » : Haut->Droit->Bas->Gauche->Haut->etc…

Pour coder ca en c#, définissions tout d’abord une énumération pour la direction :

Nous allons maintenant créer une fonction Tourner qui prend en argument la direction précédente et retourne la nouvelle direction de cette maniere : Haut->Droit->Bas->Gauche->Haut->etc.. Ce qui nous ammene à écrire :

Maintenant, il nous faut une fonction nous permettant de nous renvoyer les coordonnées de la prochaine position en fonction de la position précédente, du nombre de pas et de la direction (a noter que les positions sont matérialisés par l’objet Point possédant les propriétés X et Y) :

Une fois tout cela créé, il nous reste plus qu’a créer la fonction principale du programme composée de 3 boucles :

  • La 1er, boucle de 0 au nombre de pas (nommé jump) et calcule les prochaines positions.
  • La 2eme, boucle de 0 a 2 et appelle la 1er boucle, incrémente jump puis appelle la fonction Tourner
  • Enfin la dernière, de 0 a X où X le point d’arrêt.

Le code donne :

Et voila le tour est joué ! Si l’on s’amuse a mettre le code :

à l’endroit de Insérer le code voulu ! nous obtenons :

Facile non ? 🙂

Dev,Algo,.NET

Feb.05

Fonction de recherche dans les generics sous C# 2.0

Fort content d’avoir decouvert les generics avec la nouvelle version du C# 2.0 (et .NET 2), ils permettent de créer des collections typées evitant toutes les problematies du boxing/unboxing ! En gros un generics est ni plus ni moins qu’un conteneur d’objet.
Petit exemple :

Cela nous permet d’avoir dans monGenerics 2 objets de types string qui sont ici test1 et test2.
Plein de methodes et/ou proprietes existent sur ces objets conteneur dont les principaux :

  • Count : pour renvoyer un ‘int’ du nombre d’objet dans notre generics (ici : 2)
  • Add & AddRange : pour ajouter un objet ou une collection de plusieurs objets
  • Remove & RemoveAll & RemoveAt : pour supprimer un objet, plusieurs, ou par rapport a son index dans la generics
  • etc…. (un petit coup de Reflector pour tout voir !!)

Mais dans ce post nous allons seulement nous interresser aux methodes de recherche dans notre Generics grâce aux methodes suivantes : Find, FindAll, FindIndex (il existe aussi FindLast et FindLastIndex mais nous ne le developperons pas dans ce post).

  • Find : permet de rechercher un objet dans notre générics ! Il renvoi donc un objet de meme type que notre generics (dans notre exemple, cette fonction renverra un ‘string’)
  • FindAll : permet de rechercher plusieurs objets, il renverra dans un generics de meme type (dans notre exemple, cette fonction renverra un ‘List<string>’)
  • FindIndex : permet de recuperer l’index de l’objet rechercher. Il renvoi un ‘int’.

Ces 3 methodes prennent en argument un Predicate qui sera notre condition de recherche (un genre de WHERE en SQL). A noter que la methode FindIndex peut etre surchargé des arguments startIndex et count en ‘int’.

Pour faire une bonne fonction de recherche, personnellement j’utilise un délégué comme Predicate qui pointe faire une fonction boolean qui est a true si l’objet respecte bien notre condition de recherche.

Le mieux est de comprendre par un exemple :

  • Nous allons créer une structure nommé Personne qui contiendra 3 proprietes : Nom, Prenom et Ville pouvant etre remplit via le constructeur de notre structure.
  • Nous créons plusieurs personnes que nous ajouterons a notre Generics de type Personne :
Notre generics maListe contient ici 5 objets Personne. Nous voulons mettant recupérer l’index de l’objet Personne de Mr DUPONT. Nous pouvons ecrire :
Celui ci nous retournera « 3 » ! La condition de recherche a directement été ecrite en dur dans notre délégué.

Recherche avancé :
Nous allons ici créer une methode de recherche de type boolean sur le champs Nom :

Nous cherchons maintenant toutes les personnes ayant le nom « WARIN » :

Ici notre generics warinPeople contiendra 2 objets Personne, pour Julien et Sébastien ! Biensûr dans cette exemple la fonction FindByName est très simple nous aurons pu ecrire cela directement dans notre délégué comme pour l’exemple avec l’index de Mr DUPONT. Mais cela pour montrer que notre délégué peut pointer vers une fonction de recherche de type boolean beaucoup plus complexe et prennant plusieurs arguments en entrée.

J’utilise actuellement cela pour mon projet SimImmuno II actuellement developpement, dont voici un exemple de code :

Le tout appelé par :

Voila, quelques exemples des methodes de recherche dans un generics, j’espere avoir pu vous aider…

Plus d’info sur le site MSDN a l’adresse : http://msdn2.microsoft.com/library/6sh2ey19(en-US,VS.80).aspx

Dev,.NET