O'Reilly Forums: Question On Pg 365 About Storing Multiple Items In A Dictionary - O'Reilly Forums

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Question On Pg 365 About Storing Multiple Items In A Dictionary

#1 User is offline   -Taurus- 

  • New Member
  • Pip
  • Group: Members
  • Posts: 4
  • Joined: 01-November 12

Posted 01 November 2012 - 10:15 AM

I'm curious about the question on page 365 just under the "Do this" label, how can you store numbers for retired people from multiple teams? I can't really figure this one out.

Thanks
0

#2 User is offline   Sikta_26785 

  • Active Member
  • PipPipPip
  • Group: Members
  • Posts: 67
  • Joined: 18-May 11

Posted 01 November 2012 - 05:14 PM

It depends on how you want to see the data displayed. Both of my examples are going to use the following enum:

public enum TeamName
{
    Team1,
    Team2,
    Team3,
    etc,
}


One way would be to have a combobox where you pick the team, then the rest of the form would look the same. You would store this data like so:
Dictionary<TeamName, Dictionary<int, JerseyNumber>> allRetiredNumbers = new Dictionary<TeamName, Dictionary<int, JerseyNumber>>();
Dictionary<int, JerseyNumber> teamRetiredNumbers = new Dictionary<int, JerseyNumber>();
teamRetiredNumbers.Add(3, new JerseyNumber("Babe Ruth", 1948));
teamRetiredNumbers.Add(4, new JerseyNumber("Lou Gehrig", 1939));
teamRetiredNumbers.Add(5, new JerseyNumber("Joe DiMaggio", 1952));
allRetiredNumbers.Add(TeamName.Team1, teamRetiredNumbers);
teamRetiredNumbers = new Dictionary<int, JerseyNumber>();
teamRetiredNumbers.Add(3, new JerseyNumber("Some Player", 1948));
teamRetiredNumbers.Add(4, new JerseyNumber("Another Player", 1939));
teamRetiredNumbers.Add(5, new JerseyNumber("One More", 1952));
allRetiredNumbers.Add(TeamName.Team2, teamRetiredNumbers);


You would access the data like this:
JerseyNumber jerseyNumber = allRetiredNumbers[(TeamName)teamName.SelectedItem][(int)number.SelectedItem];


Another way of doing it if you wanted to select a number and display all players from any team that the number is retired for would be like this (add a field for TeamName to the JerseyNumber class):
Dictionary<int, List<JerseyNumber>> allRetiredNumbers = new Dictionary<int, List<JerseyNumber>>();
List<JerseyNumber> retiredNumbers = new List<JerseyNumber>();
retiredNumbers.Add(new JerseyNumber(TeamName.Team1, "Babe Ruth", 1948));
retiredNumbers.Add(new JerseyNumber(TeamName.Team2, "Some Player", 1939));
retiredNumbers.Add(new JerseyNumber(TeamName.Team3, "Another Player", 1952));
allRetiredNumbers.Add(3, retiredNumbers);
retiredNumbers = new List<JerseyNumber>();
retiredNumbers.Add(new JerseyNumber(TeamName.Team1, "One More", 1948));
retiredNumbers.Add(new JerseyNumber(TeamName.Team2, "Second One", 1939));
retiredNumbers.Add(new JerseyNumber(TeamName.Team3, "Third Player", 1952));
allRetiredNumbers.Add(4, retiredNumbers);


Access it just like before but instead of getting a single JerseyNumber back, you will get a List<JerseyNumber> and can display this in a ListBox or something.

This post has been edited by Sikta_26785: 01 November 2012 - 05:15 PM

0

#3 User is offline   -Taurus- 

  • New Member
  • Pip
  • Group: Members
  • Posts: 4
  • Joined: 01-November 12

Posted 05 November 2012 - 09:27 AM

Thanks for the response Sikta, never thought of using a dictionary within a dictionary or using an Enum. Guess I'm lacking on the creative side.
0

#4 User is offline   Sikta_26785 

  • Active Member
  • PipPipPip
  • Group: Members
  • Posts: 67
  • Joined: 18-May 11

Posted 06 November 2012 - 01:09 PM

The reason I used an enum for the team names rather than just putting in a string is because if you were later to change one of the team names, by using the enum you will get a compiler warning that the old name doesn't exist and can quickly make the changes. Using a string, you wouldn't know about places you missed the change until runtime errors or strange behavior. I use enums as much as possible for things like this.
0

#5 User is offline   MunyaChasumba 

  • New Member
  • Pip
  • Group: Members
  • Posts: 2
  • Joined: 08-January 13

Posted 16 January 2013 - 04:58 AM

This is an alternative I came up with, if you have another better way of doing it please share.

    public partial class Form1 : Form
    {
        Dictionary<TeamName, Dictionary<int, JerseyNumber>> allRetiredNumbers = new Dictionary<TeamName, Dictionary<int, JerseyNumber>>() 
        { 
            {
               TeamName.Team1,
               new Dictionary<int,JerseyNumber >()  
               {                
                    {3, new JerseyNumber("Jd1 Player", 1948)},
                    {4, new JerseyNumber("Is1 Player", 1939)},
                    {5, new JerseyNumber("Ny1 More", 1952)},
               }
            },         
            {
               TeamName.Team2,
               new Dictionary<int,JerseyNumber >()  
               {                
                    {3, new JerseyNumber("Ma2 Player", 1948)},
                    {4, new JerseyNumber("Ta2 Player", 1939)},
                    {5, new JerseyNumber("Kea2 More", 1952)},
               }
           },          
           {
               TeamName.Team3,
               new Dictionary<int,JerseyNumber >()  
               {                
                    {3, new JerseyNumber("A3 Player", 1948)},
                    {4, new JerseyNumber("Py3 Player", 1939)},
                    {5, new JerseyNumber("Mae More", 1952)},
               }
           },
           {
               TeamName.etc,
               new Dictionary<int,JerseyNumber >()  
               {
                    {3, new JerseyNumber("Babe Ruth", 1948)},
                    {4, new JerseyNumber("Lou Gehrig", 1939)},
                    {5, new JerseyNumber("Joe DiMaggio", 1952)},
                    {7, new JerseyNumber("Mickey Mantle", 1969)},
                    {8, new JerseyNumber("Yogi Berra", 1972)},
                    {10, new JerseyNumber("Phil Rizzuto", 1985)},
                    {23, new JerseyNumber("Don Mattingly", 1997)},
                    {42, new JerseyNumber("Jackie Robinson", 1993)},
                    {44, new JerseyNumber("Reggie Jackson", 1993)},
               }
           },
        };

        public Form1()
        {
            InitializeComponent();
            foreach (int key in allRetiredNumbers.Keys)
            {
                team.Items.Add(key);
            }
        }

        private void number_SelectedIndexChanged(object sender, EventArgs e)
        {
            JerseyNumber jerseyNumber = allRetiredNumbers[(TeamName)team.SelectedItem][(int)number.SelectedItem];
            //JerseyNumber jerseyNumber = retiredNumbers[(int)number.SelectedItem];
            nameLabel.Text = jerseyNumber.Player;
            yearLabel.Text = jerseyNumber.YearRetired.ToString();
        }

        private void team_SelectedIndexChanged(object sender, EventArgs e)
        {
            number.Items.Clear();
            foreach (int key in allRetiredNumbers[(TeamName)team.SelectedItem].Keys)
                number.Items.Add(key); 
        }
    }
}

0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users