Avatar billede havmaage Juniormester
27. maj 2011 - 22:16 Der er 13 kommentarer og
1 løsning

flere kolloner i en hashtable

Hejsa
Jeg ville gerne kunne gemme og tilgå flere kolloner i min hashtable
I hashtable kan jeg oprette /addere to værdier til en key og values

jeg ville gerne kunne arbejde med flere værdier fra f.eks et object eller en struct

her er den kode jeg sidder og bøvler med

class Bog
    {

        public string cForfat;
        public string ctitel;
        public int cantal;
        Hashtable dicbog = new Hashtable();
        public Bog(string Forfat, string titel, int antal)
         
        {
            cForfat = Forfat;
            ctitel = titel;
            cantal = antal;

        }
     
                 
        public void test()
     
        {
     
                     
          dicbog.Add(1, // her ville jeg gerne addere Bog objectet til min hashtabel  );
         
      }
     
       
       
        public  void udskriv()
      {
          foreach (DictionaryEntry key in dicbog )
          {
             
              // her vil jeg gerne kunne udskrive eller tilgå de enkelte kolonner, men jeg ved ikke hvordan

              Console.WriteLine("{0}{1}" ,key.Key, key.Value[cForfat. titel osv);
          }
         
      }
Avatar billede arne_v Ekspert
27. maj 2011 - 22:22 #1
1) du skal nok have din struktur som indeholde flere instanse af Bog ud i en anden klasse BogSamling
Avatar billede arne_v Ekspert
27. maj 2011 - 22:22 #2
2) brug Dictionary<K,V> fremfor Hashtable fordi den er mere type safe
Avatar billede arne_v Ekspert
27. maj 2011 - 22:23 #3
3)

dicbog.Add(1, // her ville jeg gerne addere Bog objectet til min hashtabel  );

->

dicbog.Add(1, this);

men se #1.

dic.Add(enbog.Titel, enbog);

i BogSamlig er hvad du oensker.
Avatar billede arne_v Ekspert
27. maj 2011 - 22:25 #4
4)

Console.WriteLine("{0}{1}" ,key.Key, key.Value[cForfat. titel osv);

->

Console.WriteLine("{0}{1}" ,key.Key, ((Bog)key.Value).Titel);

men hvis du goer som jeg foreslaar i #2 saa kan du noejes med:

Console.WriteLine("{0}{1}" ,key.Key, key.Value.Titel);
Avatar billede arne_v Ekspert
27. maj 2011 - 22:25 #5
5)

Brug properties fremfor fields.
Avatar billede havmaage Juniormester
27. maj 2011 - 22:51 #6
Hej igen, jeg synes nu at have en stumnp kode der rent faktisk gør det jeg gerne vil, der er nok plads til forbedring men stærkt inspireret af dine råd.
jeg anvender dog en gammeldags struct som bogsamling

public struct bogsamling
{
    public string forfatter;
    public string titel;
    public int antal;
}
//namespace Bog
    class Bog
    {
        bogsamling minbog = new bogsamling();
        Dictionary<int, bogsamling> dicbog = new Dictionary<int, bogsamling>();

//        Hashtable dicbog = new Hashtable();
        public Bog(string Forfat, string titel, int antal)
         
        {
     
            minbog.forfatter = Forfat;
            minbog.titel = titel;
            minbog.antal = antal;

        }
     
                 
        public void test()
     
        {
     
                     
          dicbog.Add(1, minbog);
         
      }
     
       
       
        public  void udskriv()
        {
          foreach (KeyValuePair<int, bogsamling> pair in dicbog)
                {
                    Console.WriteLine("{0}, {1}, {2}",
                    pair.Key,
                    pair.Value.titel, pair.Value.antal);
                }
 
        }
         
  }
Avatar billede arne_v Ekspert
27. maj 2011 - 23:11 #7
Du kan godt bruge struct, men husk paa at der saa er kopier i omloeb.

Bog-BogSamling er stadig ikke god.
Avatar billede janus_007 Nybegynder
28. maj 2011 - 23:34 #8
Jeg forstår ikke helt hvorfor du bekymrer dig om hvorvidt det er dictionary eller hashtable eller hvad der nu end findes fra .Net 1.1?
Arbejder du i noget nyere end bare .Net 2, ville jeg helt sikkert arbejde med typesikre samlinger som Arne også nævner.

eks.vis ville jeg dropped det hejs med add to dictionary, det virker lidt oldschool.

og hvorfor er din bogsamling en struct?

Gør hellere sådan her: (husk også korrekt namingconvention)

public class Bogsamling
{
    public string Forfatter;
    public string Titel;
    public int Antal;
}
//namespace Bog
    class Bog
    {
       
List<Bogsamling> bogsamlinger = new List<Bogsamling>();
        public Bog(string forfatter, string titel, int antal)       
        {
      bogsamlinger.Add(new Bogsamling{
            forfatter, titel, antal});

        }
     
                 
        //drop det testfims
       
       
        public  void udskriv()
        {
          foreach (var bogsamling in bogsamling)
                {
                    Console.WriteLine("{0}, {1}, {2}",
                    bogsamling.titel, bogsamling.antal);
                }
 
        }
         
  }

Hvis du så stadig vil have muligheden for et dictionary, så skriv lige igen :)
Avatar billede havmaage Juniormester
02. juni 2011 - 21:22 #9
et noget forsinket tilbagemelding, jeg har været på Jelling festival og haft en travl uge, men jeg ønsker faktisk at fortsætte med dictionary, men har dog droppet min struct og lavet en public class i stedet for.
Jeg har dog et problem endnu
Jeg vil gerne lave en procedure der kan chekke på det enkelte felt i et dictionary dvs.
her looper jeg igennem mit dictionary, det er sådan set fint nok
public void udskriv_boger()
        {
          foreach (KeyValuePair<int, bog> pair in dicbog)
                {
                    Console.WriteLine("{0}, {1}, {2}, {3}",
                    pair.Key,
                    pair.Value.titel, pair.Value.antal, pair.Value.forfatter + "\n");
                }
 
        }
Men hvad nu hvis jeg bare gerne ville læse på en bog ad gangen og bog_id er key i mit dictionary ( DVS jeg vil bare læse titel på bog_id x

public bool udskriv_bog(bog_id)
        {
          foreach (KeyValuePair<int, bog> pair in dicbog)
                {
                    Console.WriteLine("{0}, {1}, {2}, {3}",
                    pair.Key,
                    pair.Value.titel, pair.Value.antal, pair.Value.forfatter + "\n");
                }
 
        }



en parametre som er ditionary key og jeg gerne ville nøjes med at læse forfatter feltet og returnere true hvis eksistere og false hvis ikke eksistere
Jeg kan godt det der med containsKey(bog_id) men jeg kan ikke finde ud af at tilgå/læse de enkelte Variable som titel og forfatter uden at lave det loop.
Det er nok rent syntaks mæssigt jeg er lidt i baglås her
Avatar billede arne_v Ekspert
02. juni 2011 - 21:36 #10
dicbog[bog_id].titel
dicbog[bog_id].forfatter

boer virke
Avatar billede havmaage Juniormester
03. juni 2011 - 18:12 #11
Hej Arne det virkede perfekt. Egenligt burde jeg vel lukke spg. og oprette et nyt,men jeg tillader mig lige at stille et lille tillægs spg. Jeg forstår ikke helt dealen med den her fejl besked
"not all code paths returns a value"
jeg har denne lille funktion der såmænd bare skal returnere en int hvis den altså eksistere

int find_kunde(string søgetekst)
      {
          foreach (KeyValuePair<int, kunde> pair in dicKunde)
          {
              if (dicKunde[pair.Key].fornavn == søgetekst)
                  return pair.Key;
             
                 
          }
         
      }

hvordan skal det håndteres ( jeg kan jo bare sætte nogle returns ind og prøve mig frem men jeg synes bare ikke det giver mening )
Avatar billede arne_v Ekspert
03. juni 2011 - 21:16 #12
int find_kunde(string søgetekst)
      {
          foreach (KeyValuePair<int, kunde> pair in dicKunde)
          {
              if (dicKunde[pair.Key].fornavn == søgetekst)
                  return pair.Key;
           
               
          }
          return -1;       
      }

eller

int find_kunde(string søgetekst)
      {
          foreach (KeyValuePair<int, kunde> pair in dicKunde)
          {
              if (dicKunde[pair.Key].fornavn == søgetekst)
                  return pair.Key;
           
               
          }
          throw new Exception("Kunde findes ikke"); 
      }
Avatar billede havmaage Juniormester
03. juni 2011 - 22:07 #13
Tusind tak for det, logisk når nu jeg ser det. Læg venlist svar så jeg kan få lukket denne følgeton...

Jeg mener arne bør have point for den, Janus hvis du er meget uenig så skriv det lige....

Det har været lærerigt indtil videre.
Avatar billede arne_v Ekspert
04. juni 2011 - 00:34 #14
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester