Developpez.com

Plus de 2 000 forums
et jusqu'à 5 000 nouveaux messages par jour

Sortie de la version 0.6 de Dvp.NET
Au programme du Linq, de l'accès aux données, du WPF et du Windows Forms

Le , par tomlev, Rédacteur/Modérateur


Dvp.NET est une bibliothèque de classes pour les applications .NET, développée par des membres de Developpez.com. Elle couvre de nombreux aspects du développement : manipulation de collections, de chaines de caractères, accès aux données, interface graphique, algorithmes métier... Bref, c'est une sorte de couteau suisse pour tous les développeurs .NET, un peu à la manière de Boost pour C++ (bon, on a encore un peu de travail avant de pouvoir vraiment se comparer à Boost )

Pour installer Dvp.NET, le plus simple est d'utiliser Nuget, le gestionnaire de packages pour Visual Studio, comme expliqué ici. Vous pouvez aussi télécharger la librairie directement en utilisant les liens à la fin de ce post.

Au programme de cette version : du Linq, de l'accès aux données, du WPF, du Windows Forms... bref, de tout, ou presque . Je vous laisse examiner le détail de nouveautés !

  • Assembly Developpez.Dotnet
    • Classe EnumerableExtensions
      • Méthode d'extension Flatten : permet "d'aplatir" une hiérarchie d'objets. Cette méthode était déjà présente dans les versions précédentes, mais cette nouvelle surcharge permet d'obtenir le niveau de chaque noeud dans la hiérarchie :

        Code C# : Sélectionner tout
        1
        2
        3
        4
        var flat = rootNodes.Flatten( 
                    node => node.Children, 
                    TreeTraversalMode.DepthFirst, 
                    (node, lvl) => new { Level = lvl, Name = node.Name });
        Résultat :
        Level	Name
        0 Node 1
        1 Node 1.1
        2 Node 1.1.1
        1 Node 1.2
        0 Node 2
        1 Node 2.1
      • Méthodes d'extensions InsertRange, RemoveRange et RemoveAll : équivalentes aux méthodes du même nom de List<T>, mais s'appliquent à n'importe quelle ICollection<T> (ou IList<T> pour InsertRange)
      • Méthode d'extension DistinctUntilChanged : enlève les doublons contigus d'une séquence, i.e. [1, 1, 2, 3, 3, 3, 2, 3, 1, 1] devient [1, 2, 3, 2, 3, 1] (inspiré de la méthode Observable.DistinctUntilChanged de Rx, mais appliqué aux IEnumerable<T>)
    • Classe LinqHelper
      • Méthode Generate : génère une séquence à partir d'une valeur initiale, d'une condition d'arrêt et d'une fonction de transition (encore inspiré de Rx). Exemple :
        Code C# : Sélectionner tout
        1
        2
        3
        4
        5
        6
        7
        // Génère les nombres de Fibonacci inférieurs à 100 
        var fibonacci = 
            LinqHelper.Generate( 
                new { value = 0, next = 1 }, 
                s => s.value < 100, 
                s => new { value = s.next, next = s.value + s.next }, 
                s => s.value);
    • Classe DictionaryExtensions
      • Méthode d'extension GetOrAdd : tente de récupérer une valeur dans le dictionnaire ; si la clé demandée est absente du dictionnaire, crée la valeur avec la fonction spécifiée et l'ajoute au dictionnaire.
        Ça permet de simplifier ce genre de code :
        Code C# : Sélectionner tout
        1
        2
        3
        4
        5
        6
        7
        Foo foo; 
        if (!_foos.TryGetValue(key, out foo)) 
        { 
            foo = CreateFoo(key); 
            _foos[key] = foo; 
        } 
        return foo;
        En ceci :
        Code C# : Sélectionner tout
        1
        2
        3
        4
        return _foos.GetOrAdd(key, k => CreateFoo(k)); 
          
        // ou encore plus simple : 
        return _foos.GetOrAdd(key, CreateFoo);
      • Méthode d'extension GetOrCreate : comme GetOrAdd, mais n'ajoute pas la valeur générée au dictionnaire
    • Classe DataExtensions
      • Méthode d'extension SetParameters : permet de définir les paramètres d'une requête via un objet :

        Code C# : Sélectionner tout
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        string sql = "INSERT INTO Persons(Id, LastName, FirstName, DateOfBirth) VALUES (@id, @lastName, @firstName, @dateOfBirth)"; 
        using (var command = connection.CreateCommand(sql)) 
        { 
            var parameters = new 
            { 
                Id = Guid.NewGuid(), 
                LastName = "Morrison", 
                FirstName = "Jim", 
                DateOfBirth = new DateTime(1943, 12, 8) 
            }; 
            command.SetParameters(parameters).ExecuteNonQuery(); 
        }
      • Méthode d'extension Query : exécute une requête en utilisant les paramètres spécifiés :
        Code C# : Sélectionner tout
        1
        2
        3
        4
        5
        6
        string sql = "SELECT * FROM Persons WHERE Country = @country AND Age > @minAge"; 
        var parameters = new { Country = "France",  MinAge = 18 }; 
        foreach (var result in connection.Query(sql, parameters)) 
        { 
            Console.WriteLine("{0} {1}", result.GetString("FirstName"), result.GetString("LastName")); 
        }
      • Méthode d'extension QueryScalar : comme Query, mais renvoie un scalaire :
        Code C# : Sélectionner tout
        1
        2
        3
        string sql = "SELECT Age FROM Persons WHERE Id = @id"; 
        var parameters = new { Id = 42 }; 
        int age = (int)connection.QueryScalar(sql, parameters);
      • Méthode d'extension Execute : comme Query, mais pour une commande qui ne renvoie pas de résultat :
        Code C# : Sélectionner tout
        1
        2
        3
        4
        5
        6
        7
        8
        9
        string sql = "INSERT INTO Persons(Id, LastName, FirstName, DateOfBirth) VALUES (@id, @lastName, @firstName, @dateOfBirth)"; 
        var parameters = new 
        { 
            Id = Guid.NewGuid(), 
            LastName = "Morrison", 
            FirstName = "Jim", 
            DateOfBirth = new DateTime(1943, 12, 8) 
        }; 
        connection.Execute(sql, parameters);
    • Classe StringExtensions
      • Méthode d'extension ReplaceAt : remplace un caractère à la position spécifiée
    • Classe CompareExtensions
      • Méthodes d'extension Min/Max: permettent d'obtenir le min ou le max de 2 items à partir d'un comparateur :
        Code C# : Sélectionner tout
        string max = StringComparer.CurrentCulture.Max("hello", "world");
    • Classe CoreExtensions
      • Méthode d'extension FormatWithTemplate : pour formater un objet à l'aide de StringTemplate :
        Code C# : Sélectionner tout
        string text = user.FormatWithTemplate("{Name} est né le {DateOfBirth:dd MMMM yyyy} et habite à {City}");
      • Méthodes d'extension Add(IntPtr, int) et Subtract(IntPtr, int) : ajoute ou soustrait un offset à un pointeur.
    • Classe VersionNumber : représente un numéro de version qui respecte les règles du semantic versioning
    • Classe TrieDictionary<T> : dictionnaire basé sur une trie, ce qui permet des recherches très rapides par préfixe de la clé.
    • Classe IniFile : gestion plus fine de l'encodage. Il est maintenant possible de spécifier l'encodage à utiliser pour le fichier INI.
    • Classe StringTemplate : amélioration des performances (ajout d'un cache pour ne pas devoir parser le même template plusieurs fois)
  • Assembly Developpez.Dotnet.Windows
    • Classe InputBehavior
      • Propriété attachée UseCultureDependentDecimal : permet d'obtenir un comportement identique à celui d'Excel lors de la saisie de nombre décimaux, à savoir que le point du pavé numérique sera converti en le séparateur décimal de la culture courante.
    • Classe TextBlockBehavior
      • Propriété attachée RichText : corrigé un plantage quand le texte riche contient des caractères accentués ou autres caractères spéciaux
    • Classe GroupName : permet de restreindre un nom de groupe (pour les RadioButtons par exemple) à une portée locale. Cela permet, dans le cas d'un groupe de RadioButtons dans un template, d'éviter que l'exclusion mutuelle ne s'étende à toutes les instances du template. Exemple:
      Code XAML : Sélectionner tout
      1
      2
      3
      4
      5
      <StackPanel dvp:GroupName.IsGroupNameScope="True"> 
          <RadioButton Content="Foo" GroupName="{dvp:GroupName myGroup}" /> 
          <RadioButton Content="Bar" GroupName="{dvp:GroupName myGroup}" /> 
          <RadioButton Content="Baz" GroupName="{dvp:GroupName myGroup}" /> 
      </StackPanel>
    • Classe GridViewBehavior : amélioration du tri : si un tri est déjà appliqué à la liste au départ, le glyphe correspondant est affiché dans l'en-tête de colonne
    • Classe DependencyObjectExtensions :
      • Méthode d'extension FindDescendants : renvoie tous les descendants visuels d'un élément qui ont le type spécifié
    • Classe ViewModelBase : nettoyage des membres inutiles, extraction d'une classe de base ObservableBase
    • Classe ObservableBase : implémentation basique de INotifyPropertyChanged
  • Assembly Developpez.Dotnet.Windows.Forms
    • Classe WinFormsExtensions
      • Méthode d'extension FlashWindow : fait clignoter la fenêtre pour attirer l'attention de l'utilisateur (utilise l'API Windows FlashWindowEx)
    • Classe ItemStyleListBox : une ListBox qui permet d'appliquer un style différent à chaque élément, via un évènement (même principe que pour ItemStyleComboBox)
  • Assembly Developpez.Dotnet.Drawing
    • Classe BitmapExtensions
      • Méthode d'extension RemoveTransparency : enlève la transparence d'une image en la plaçant sur un fond de la couleur spécifiée
      • Méthode d'extension LockPixels : comme LockBits (pour l'accès rapide aux pixels de l'image), mais beaucoup plus simple à utiliser... Ça donne par exemple quelque chose comme ça :
        Code C# : Sélectionner tout
        1
        2
        3
        4
        5
        6
        7
        8
        9
        using (var pixels = bitmap.LockPixels(ImageLockMode.ReadWrite)) 
        { 
            for (int y = 0; y < pixels.Height; y++) 
            for (int x = 0; x < pixels.Width; x++) 
            { 
                Color c = pixels[x, y]; 
                pixels[x, y] = TransformColor(c); 
            } 
        }
    • Classe ColorExtensions
      • Méthode d'extension ToHsv : convertit une couleur RGB en HSV
      • Méthode d'extension ToHsl : convertit une couleur RGB en HSL
      • Méthode d'extension ToRgb : convertit une couleur HSV ou HSL en RGB
      • Méthode d'extension ToGrayScale : convertit une couleur en niveau de gris

  • Assembly Developpez.Dotnet.System
    • Classes FileMoveOperation et FileCopyOperation : 2 petites améliorations
      • Méthode ExecuteAsync : exécute l'opération de façon asynchrone ; les notifications de progression sont déclenchées sur le thread qui a lancé l'opération (en général le thread UI)
      • Evènement Completed : se produit quand l'opération est terminée

  • Documentation
    Vous l'avez peut-être déjà remarqué car c'est en place depuis quelques mois, mais la documentation a été nettement (quoique discrètement) améliorée :
    • Correction d'un bug qui faisait apparaitre n'importe où certaines méthodes d'extension
    • Améliorations de la version en ligne :
      • Chargement dynamique de l'arborescence des classes et namespaces, ce qui fait que la page se charge plus rapidement
      • Index des mots-clés
      • Recherche par mot-clé (il faut rechercher le mot exact, mais c'est quand même un progrès...)
      • Lien direct vers une page de la doc




J'espère que toutes ces nouveautés vous seront utiles ! N'hésitez pas à nous suggérer des nouveautés et à signaler les bugs sur le gestionnaire de projet

Téléchargements


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de Louis-Guillaume Morand Louis-Guillaume Morand - Rédacteur https://www.developpez.com
le 22/05/2012 à 11:30
ahhh, bah depuis le début cette lib ne me disait rien parce que j'ai toujours peur qu'un tel framework finisse en fourre-tout mais là, en lisant le changelog, force est de constater que plusieurs méthodes d'extension, j'ai pris l'habitude de les refaire à chaque fois alors que je pourrais les prendre directement dedans

je vais devoir regarder tout ca de plus prêt

ps: j'ai pas compris ca
Méthode d'extension GetOrCreate : comme GetOrAdd, mais n'ajoute pas la valeur générée au dictionnaire

si ca n'existe pas, ca le créér et le retourne, sans l'ajouter au dictionnaire, c'est ca?
Avatar de tomlev tomlev - Rédacteur/Modérateur https://www.developpez.com
le 22/05/2012 à 11:48
Citation Envoyé par Louis-Guillaume Morand  Voir le message
ahhh, bah depuis le début cette lib ne me disait rien parce que j'ai toujours peur qu'un tel framework finisse en fourre-tout

Bah c'est effectivement un fourre-tout, mais un fourre-tout organisé avec plein de choses utiles

Citation Envoyé par Louis-Guillaume Morand  Voir le message
ps: j'ai pas compris ca

si ca n'existe pas, ca le créér et le retourne, sans l'ajouter au dictionnaire, c'est ca?

Oui, c'est bien ça
Avatar de asys1 asys1 - Membre à l'essai https://www.developpez.com
le 30/05/2012 à 14:25
j'aimerais savoir pourquoi vous développez Dvp.NET?
Quid de Mono, ne fait-il pas l'affaire?
Avatar de tomlev tomlev - Rédacteur/Modérateur https://www.developpez.com
le 30/05/2012 à 14:45
Citation Envoyé par asys1  Voir le message
j'aimerais savoir pourquoi vous développez Dvp.NET?
Quid de Mono, ne fait-il pas l'affaire?

Ça n'a absolument aucun rapport... Mono est une implémentation open-source du CLI (common language infrastructure), qui inclue des compilateurs, un runtime, et une implémentation des librairies .NET standard.

Dvp.NET n'a rien à voir avec ça, c'est juste une librairie d'utilitaires divers (qui ne sont d'ailleurs pas dans Mono)
Avatar de champomy62 champomy62 - Membre actif https://www.developpez.com
le 08/06/2012 à 10:30
Salut à tous,

Puis-je participer au projet Dvp.NET ?
Avatar de tomlev tomlev - Rédacteur/Modérateur https://www.developpez.com
le 08/06/2012 à 12:32
Citation Envoyé par champomy62  Voir le message
Salut à tous,

Puis-je participer au projet Dvp.NET ?

Oui bien sûr, si tu as des contributions intéressantes à proposer
Avatar de champomy62 champomy62 - Membre actif https://www.developpez.com
le 08/06/2012 à 12:36
!

Y'a t-il une liste des fonctionnalitées à implémenter ou c'est au choix ?
Avatar de tomlev tomlev - Rédacteur/Modérateur https://www.developpez.com
le 08/06/2012 à 21:24
Citation Envoyé par champomy62  Voir le message
Y'a t-il une liste des fonctionnalitées à implémenter ou c'est au choix ?

Il n'y a pas de liste, chacun propose ce qu'il veut...

Les critères pour les contributions sont grosso-modo les suivants :

- utile (sans blague...)
- facilement réutilisable
- pas trop spécifique à un domaine particulier
- pas de dépendances à des libs externes (à part bien sûr celles de .NET), sauf exceptions à discuter au cas par cas
Offres d'emploi IT
Développeur WEB PHP F/H
VACALIANS GROUP - Languedoc Roussillon - SETE (34)
Développeur Web FULL-STACK
VACALIANS GROUP - Languedoc Roussillon - SETE (34)
RESPONSABLE WEB ANALYTICS F/H
VACALIANS GROUP - Languedoc Roussillon - SETE (34)

Voir plus d'offres Voir la carte des offres IT
Contacter le responsable de la rubrique Projets