C#資料群集系列菜單-『Dictionary與foreach』

摘要:C#資料群集系列菜單-『Dictionary與foreach』

~哀悼~ 給予不幸的人。
 

 
~本文主題~
『Dictionary』
主要介紹Dictionary是什麼與基本用法。
『foreach』
主要介紹foreach在Dictionary的使用與內部原理。
 

~正文開始~
 
『Dictonrary』
 
串列就像是充滿名稱的一長串資料~,但萬一你想要的是每個名稱對應某個值呢??
例如你希望一個名稱對應一個地址或電話呢?? 這時你就可以使用『Dictionary』。
你可以將Dictionary想成簡單的google翻譯,輸入你要查的單字(Key)例如apple,
他就會回傳相對應的值(Value) 蘋果。
 
我們來建立一個簡單的湘北籃球隊範例來看看。
首先我們建立一個Dictionary,並在建立時就將資料輸入進Dictionary裡。
 
(註Ckedit的程式碼顯示會怪怪的…)  
//建立湘北籃球隊的Dictionary物件命名為ShuKoKu_Numbers。
        //在建立時就將湘北隊成員建立好。
        Dictionary <int BasketballPlayer> ShuKoKu_Numbers = new Dictionary < intBasketballPlayer>()
        {
            {4, new BasketballPlayer ( "赤木",202)},
            {7, new BasketballPlayer ( "官城",170)},
            {10, new BasketballPlayer ( "櫻木",189)},
            {11, new BasketballPlayer ( "流川",188)},
            {14, new BasketballPlayer ( "三井",176)},
        };
 
新增資料還有一個方法Add()

Dictionary< int, BasketballPlayer > ShuKoKu_Numbers = new Dictionary< int, BasketballPlayer >();
            ShuKoKu_Numbers.Add(4, new BasketballPlayer ("赤木", 202));
            ShuKoKu_Numbers.Add(7, new BasketballPlayer ("官城", 170));
            ShuKoKu_Numbers.Add(10, new BasketballPlayer ("櫻木", 189));
            ShuKoKu_Numbers.Add(11, new BasketballPlayer ("流川", 188));
            ShuKoKu_Numbers.Add(12, new BasketballPlayer ("三井", 176));

 

其中

Dictionary< int , BasketballPlayer >

BasketballPlayer 類別


 class BasketballPlayer
    {
        //Name屬性:姓名
        public string Name { get; private set; }
        //Height屬性:身高
        public int Height { get; private set; }

        //建構子,初始化。
        public BasketballPlayer(string name, int height)
        {
            Name = name;
            Height = height;
        }
    }

 

使用Combox選擇並取值Value看看

 public Form1()
        {
            InitializeComponent();
            //將Dictionary的Key值一開始就先傳給combox,
            //這樣combox裡才有可以選的值。
            foreach (int key in ShuKoKu_Numbers.Keys)
            {
                comboBox1.Items.Add(key);
            }
        }

 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            //將資料從Numbers Dictionary中取出。
            BasketballPlayer ShuKokuTeam = ShuKoKu_Numbers[(int )comboBox1.SelectedItem];

            textBox1.Text = ShuKokuTeam.Name;
            textBox2.Text = ShuKokuTeam.Height.ToString();
        }

 

執行結果
 
『foreach』
我也可以以用Foreach將Dictionary的資料取出。

 private void button1_Click(object sender, EventArgs e)
        {
            foreach (KeyValuePair  item in ShuKoKu_Numbers)
            {
                Console.WriteLine("索引值為:" + item.Key + " 值為:" + item.Value.Name);
            }
        }

 

執行結果
 
其中
當你撰寫foreach迴圈時,你實際上正在使用IEnumerable<T>,只要某個群集Collection
有Add()方法。代表該Collection都有實作IEnumerable。

// 摘要:
    //     公開支援指定型別集合上簡單反覆運算的列舉值。
    //
    // 型別參數:
    //   T:
    //     要列舉之物件的型別。
    public interface IEnumerable  : IEnumerable
    {
        // 摘要:
        //     傳回可逐一查看集合的列舉程式。
        //
        // 傳回:
        //     可以用來逐一查看集合的 System.Collections.Generic.IEnumerator。
        IEnumerator GetEnumerator();
    }

 

下列程式碼就是foreach背後實際做的事。
 
(註Ckedit的程式碼顯示會怪怪的…)  
  private void button1_Click(object sender, EventArgs e)
        {
 
            //foreach實際背後所做的事。
            Console .WriteLine("用IEnumerator最原始產生出值" );
            //建立IEnumerator類別的物件enumerator 用來存放使用GetEnumeraotr()方法抓取回來的『可逐一查看集合的列舉程式』
            IEnumerator <KeyValuePair < intBasketballPlayer>> enumerator = ShuKoKu_Numbers.GetEnumerator();
            while (enumerator.MoveNext())
            {
                //enumerator.Current為KeyValuePair<TKey, TValue> 型別的屬性。
                //所以才要產生一個KeyValuePair<TKey, TValue>型別的Numbers來當接收端。
                KeyValuePair <int BasketballPlayer> Numbers = enumerator.Current;
                Console .WriteLine("索引值為:" + Numbers.Key + " 值為:" + Numbers.Value.Name);
            }
        }

 

 
其中IEnumerator Interface所定義的方法

 public interface IEnumerator
    {
        // 摘要:
        //     取得集合中目前的項目。
        //
        // 傳回:
        //     集合中目前的項目。
        object Current { get ; }

        // 摘要:
        //     將列舉值往前推至下集合中的下一個項目。
        //
        // 傳回:
//  如果列舉值成功地前移至下一個項目,則為 true,如果列舉值已超過集合的結尾,則為 false。
        //
        // 例外狀況:
        //   System.InvalidOperationException:
        //     在建立列舉值之後,會修改集合。
        bool MoveNext();
        //
        // 摘要:
        //     設定列舉值至它的初始位置,這是在集合中第一個元素之前。
        //
        // 例外狀況:
        //   System.InvalidOperationException:
        //     在建立列舉值之後,會修改集合。
        void Reset();
    }

 

執行結果
 

 

 



小弟才書學淺~請各位客官指教指教~~~

小弟日 : 你要知道自已不是帥哥,你才有可能變成帥哥 。