摘要: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 < int, BasketballPlayer>()
{
{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
// 摘要:
// 公開支援指定型別集合上簡單反覆運算的列舉值。
//
// 型別參數:
// 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 < int, BasketballPlayer>> 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();
}
執行結果