IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

comment convertir HashSet<string> en byte[] ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut comment convertir HashSet<string> en byte[] ?
    Bonjour,
    J'ai un HashSet<string> que j'ai besoin de caster en byte[] et je n'arrive pas à le faire sans passer par un StringBuilder.
    Avez-vous donc une manière plus ergonomique que ce que j'utilise actuellement s'il vous plaît pour remplir le paramètre buffer de la méthode Write de l'objet Stream, sans passer donc par un objet intermédiaire (StringBuilder ici) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    FileStream fs = null;
    using (OpenFileDialog openFileDialog = new OpenFileDialog())
    {
        ...
        if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                fs = (FileStream)openFileDialog.OpenFile();
            }
    }
    HashSet<String> sqls = new HashSet<string>();
    ...
    using (StreamReader reader = new StreamReader(fs))
    {
    ....
        while ((line = reader.ReadLine()) != null)
        {
            sqls.Add("blablalba" + line);
        }
    }
    StringBuilder sb = new StringBuilder();
    foreach (String st in sqls)
        sb.AppendLine(st);
    
    Stream myStream;
    SaveFileDialog saveFileDialog1 = new SaveFileDialog();
    ...
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        if ((myStream = saveFileDialog1.OpenFile()) != null)
        {
            myStream.Write(Encoding.Default.GetBytes(sb.ToString()), 0, Encoding.Default.GetBytes(sb.ToString()).Length);
            myStream.Close();
        }
    }
    ...

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    le string builder est ce qu'il y a de plus performant pour concaténer, et 3 lignes de code c'est pas dérangeant je trouve
    si tu dois faire ca à plusieurs endroits tu peux créer une méthode d'extension

    par contre t'es au courant que le hashset supprime les doublons ? et je suis pas sur qu'il conserve l'ordre des élements non plus ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Bonjour,
    Oui j'ai choisi le HashSet pour cette particularité justement.
    Ce qui n'est pas performant c'est de devoir faire une boucle qui fondamentalement n'est pas nécessaire si j'arrivais à caster directement mon HashSet<String> en byte[]
    Citation Envoyé par Pol63 Voir le message
    le string builder est ce qu'il y a de plus performant pour concaténer, et 3 lignes de code c'est pas dérangeant je trouve
    si tu dois faire ca à plusieurs endroits tu peux créer une méthode d'extension

    par contre t'es au courant que le hashset supprime les doublons ? et je suis pas sur qu'il conserve l'ordre des élements non plus ...

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    on ne peut pas caster un hashset<string> en string
    donc il faut bien du code pour faire ce que tu veux faire

    autrement ce que tu peux faire c'est ouvrir les 2 filestream en même temps
    tu lis une ligne dans le 1er
    si elle a déjà été écrite (lehashset.Contains) tu passes à la suivante (continue
    sinon tu l'ajoutes au 2eme stream et au hashset

    à voir si c'est plus performant que le stringbuilder ... (contains sur un hashset c'est prévu pour être performant)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Je n'avais pas besoin de caster un hashset<string> en string mais un HashSet<String> en byte[].
    En fait je viens de modifier mon code pour être plus cohérent entre la manière dont je lis mon fichier et la manière dont j'écris dedans, ça me donne le code suivant que je trouve plus clair en utilisant les méthodes plus haut niveau pour écrire alors que je ne le faisais que pour lire dans ma première version. Du coup, plus besoin de l'objet StringBuilder ni de la méthode Encoding.Default.GetBytes(...,...,...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    FileStream fs = null;
    using (OpenFileDialog openFileDialog = new OpenFileDialog())
    {
        ...
        if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                fs = (FileStream)openFileDialog.OpenFile();
            }
    }
    HashSet<String> sqls = new HashSet<string>();
    ...
    using (StreamReader reader = new StreamReader(fs))
    {
    ....
        while ((line = reader.ReadLine()) != null)
        {
            sqls.Add("blablalba" + line);
        }
    }
     
    SaveFileDialog saveFileDialog1 = new SaveFileDialog();
    ...
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        FileStream fsWrite = null;
        if ((fsWrite = (FileStream)saveFileDialog1.OpenFile()) != null)
        {
            if (fsWrite != null)
            {
                using (StreamWriter writer = new StreamWriter(fsWrite))
                {
                    foreach (String st in sqls)
                        writer.WriteLine(st);
                }
            }
        }
    }
    ...
    Citation Envoyé par Pol63 Voir le message
    on ne peut pas caster un hashset<string> en string
    donc il faut bien du code pour faire ce que tu veux faire

    autrement ce que tu peux faire c'est ouvrir les 2 filestream en même temps
    tu lis une ligne dans le 1er
    si elle a déjà été écrite (lehashset.Contains) tu passes à la suivante (continue
    sinon tu l'ajoutes au 2eme stream et au hashset

    à voir si c'est plus performant que le stringbuilder ... (contains sur un hashset c'est prévu pour être performant)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment convertir un type string en byte ?
    Par savoir dans le forum Langage
    Réponses: 6
    Dernier message: 18/11/2008, 13h55
  2. Comment convertir une variable string en double?
    Par quentinoux dans le forum C++
    Réponses: 12
    Dernier message: 31/07/2006, 10h46
  3. Réponses: 12
    Dernier message: 31/01/2006, 21h46
  4. Réponses: 6
    Dernier message: 14/02/2004, 14h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo