創作內容

9 GP

C# HashTable implement on ListView

作者:貓貓風 ฅ●ω●ฅ│2019-09-16 16:20:34│贊助:18│人氣:85
.
















雜湊表(Hash table,也叫哈希表),是根據鍵(Key)而直接查詢在內存存儲位置的資料結構。也就是說,它通過計算一個關於鍵值的函數,將所需查詢的數據映射到表中一個位置來查詢記錄,這加快了查找速度。這個映射函數稱做雜湊函數,存放記錄的數組稱做雜湊表。


此篇主要以 ListView 來呈現從Hash table(雜湊表)中尋找內存的資料

預先在雜湊表中存入以下資料,從雜湊表中根據KEY選取資料並訂出資料架構

資料架構如下  一個區域有五個物件,每個物件個別有其數量

根據下圖從雜湊表找出資料並篩選出個別類型物件的數量



實作程式碼如下


  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using System.Collections;  
  10. using System.Threading;  
  11.   
  12. namespace HashTable_example  
  13. {  
  14.     public partial class Form1 : Form  
  15.     {  
  16.         //設定 console輸出  
  17.         [System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]  
  18.         static extern bool AllocConsole();  
  19.   
  20.         [System.Runtime.InteropServices.DllImport("Kernel32")]  
  21.         public static extern void FreeConsole();  
  22.         public Form1()  
  23.         {  
  24.             InitializeComponent();  
  25.         }  
  26.   
  27.         Hashtable _all = new Hashtable();  
  28.         Hashtable _fish = new Hashtable();  
  29.         Hashtable _cat = new Hashtable();  
  30.         Hashtable _mountain = new Hashtable();  
  31.         Hashtable _tree = new Hashtable();  
  32.         Hashtable _lake = new Hashtable();  
  33.   
  34.         private void Form1_Load(object sender, EventArgs e)  
  35.         {  
  36.   
  37.             //定義 listview 欄位與型態  
  38.             listView1.GridLines = true;  
  39.             listView1.FullRowSelect = true;  
  40.             listView1.View = View.Details;  
  41.             listView1.Scrollable = true;  
  42.             listView1.MultiSelect = false; // 不可以多行選擇  
  43.             listView1.HeaderStyle = ColumnHeaderStyle.Nonclickable;  
  44.   
  45.             listView1.Columns.Add("Fish", 100, HorizontalAlignment.Right);  
  46.             listView1.Columns.Add("Cat", 100, HorizontalAlignment.Left);  
  47.             listView1.Columns.Add("Mountain", 120, HorizontalAlignment.Left);  
  48.             listView1.Columns.Add("Tree", 100, HorizontalAlignment.Left);  
  49.             listView1.Columns.Add("Lake", 100, HorizontalAlignment.Left);  
  50.             listView1.Visible = true;  
  51.   
  52.             listView2.GridLines = true;  
  53.             listView2.FullRowSelect = true;  
  54.             listView2.View = View.Details;  
  55.             listView2.Scrollable = true;  
  56.             listView2.MultiSelect = false; // 不可以多行選擇  
  57.             listView2.HeaderStyle = ColumnHeaderStyle.Nonclickable;  
  58.             listView2.Visible = true;  
  59.   
  60.             String[] item_content = new String[5]; //宣告行數  
  61.             ListViewItem item; // 宣告項目  
  62.   
  63.             //加入雜湊資料  
  64.             _all.Add("Fish", 5);  
  65.             _all.Add("Cat", 3);  
  66.             _all.Add("Mountain", 3);  
  67.             _all.Add("Tree", 5);  
  68.             _all.Add("Lake", 2);  
  69.   
  70.             _fish.Add("Grass carp", 142);  
  71.             _fish.Add("Peruvian anchoveta", 200);  
  72.             _fish.Add("Silver carp", 385);  
  73.             _fish.Add("Common carp", 499);  
  74.             _fish.Add("Alaska pollock", 56);  
  75.   
  76.             _cat.Add("Abyssinian", 151);  
  77.             _cat.Add("American Bobtail", 33);  
  78.             _cat.Add("Balinese-Javanese ", 42);  
  79.   
  80.             _mountain.Add("Everest", 1);  
  81.             _mountain.Add("Kangchenjunga", 1);  
  82.             _mountain.Add("Lhotse", 1);  
  83.   
  84.             _tree.Add("Tulsi Plant", 1120);  
  85.             _tree.Add("Amla Plant", 932);  
  86.             _tree.Add("Eucalyptus", 421);  
  87.             _tree.Add("Mahagony", 563);  
  88.             _tree.Add("Aloe Vera", 116);  
  89.   
  90.             _lake.Add("Finn", 1);  
  91.             _lake.Add("Austen", 1);  
  92.   
  93.             //AllocConsole(); //啟用 console輸出  
  94.               
  95.             int index = 0;  
  96.             //將雜湊資料顯示在listview上  
  97.             while (index < _all.Count) //每列進行比較  找到當前欄位最大值表示結束  
  98.             {  
  99.                 //如果在雜湊中有找到當前欄位符合標頭,將標頭所屬資料加入 listview中  
  100.                 foreach (DictionaryEntry member in _all)  
  101.                 {  
  102.                     if (member.Key.ToString() == listView1.Columns[index].Text)  
  103.                     {  
  104.                         item_content[index] = member.Value.ToString();  
  105.                         index++;  
  106.                         break;  
  107.                     }  
  108.                 }  
  109.             }  
  110.   
  111.             //將資料加入項目  
  112.             item = new ListViewItem(item_content);   
  113.             //將項目加入listview  
  114.             listView1.Items.Add(item);  
  115.         }  
  116.   
  117.         private void listView1_Click(object sender, EventArgs e)  
  118.         {  
  119.             Point mousePos = listView1.PointToClient(Control.MousePosition);  
  120.             ListViewHitTestInfo hitTest = listView1.HitTest(mousePos);  
  121.             int columnIndex = hitTest.Item.SubItems.IndexOf(hitTest.SubItem);  
  122.             txt_selected_item.Text = listView1.Items[0].SubItems[columnIndex].Text;  
  123.             txt_selected_value.Text = listView1.Columns[columnIndex].Text;  
  124.   
  125.             Hashtable select = new Hashtable();  
  126.             if (txt_selected_value.Text == "Fish") { select = _fish; }  
  127.             else if (txt_selected_value.Text == "Cat") { select = _cat; }  
  128.             else if (txt_selected_value.Text == "Mountain") { select = _mountain; }  
  129.             else if (txt_selected_value.Text == "Tree") { select = _tree; }  
  130.             else { select = _lake; }  
  131.   
  132.             listView2.Clear();  
  133.             foreach (DictionaryEntry member in select)  
  134.             {  
  135.                 listView2.Columns.Add(member.Key.ToString(), 100,
  136.                 HorizontalAlignment.Right);  
  137.             }  
  138.   
  139.             String[] item_content = new String[5]; //宣告行數  
  140.             ListViewItem item; // 宣告項目  
  141.             int index = 0;  
  142.             //將雜湊資料顯示在listview上  
  143.             while (index < select.Count) //每列進行比較  找到當前欄位最大值表示結束  
  144.             {  
  145.                 //如果在雜湊中有找到當前欄位符合標頭,將標頭所屬資料加入 listview中  
  146.                 foreach (DictionaryEntry member in select)  
  147.                 {  
  148.                     if (member.Key.ToString() == listView2.Columns[index].Text)  
  149.                     {  
  150.                         listView2.Columns[index].TextAlign = HorizontalAlignment.Center;  
  151.                         item_content[index] = member.Value.ToString();  
  152.                         index++;  
  153.                         break;  
  154.                     }  
  155.                 }  
  156.             }  
  157.   
  158.             //將資料加入項目  
  159.             item = new ListViewItem(item_content);  
  160.             //將項目加入listview  
  161.                   
  162.             listView2.Items.Add(item);  
  163.             AutoSizeColumnList(listView2);  
  164.   
  165.         }  
  166.   
  167.         //自動對齊 ListView 依據標題長度和listview大小  
  168.         private void AutoSizeColumnList(ListView listView)  
  169.         {  
  170.             //Prevents flickering  
  171.             listView.BeginUpdate();  
  172.   
  173.             Dictionary<int, int> columnSize = new Dictionary<int, int>();  
  174.   
  175.             //Auto size using header  
  176.             listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);  
  177.   
  178.             //Grab column size based on header  
  179.             foreach (ColumnHeader colHeader in listView.Columns)  
  180.                 columnSize.Add(colHeader.Index, colHeader.Width);  
  181.   
  182.             //Auto size using data  
  183.             listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);  
  184.   
  185.             //Grab comumn size based on data and set max width  
  186.             foreach (ColumnHeader colHeader in listView.Columns)  
  187.             {  
  188.                 int nColWidth;  
  189.                 if (columnSize.TryGetValue(colHeader.Index, out nColWidth))  
  190.                     colHeader.Width = Math.Max(nColWidth, colHeader.Width);  
  191.                 else  
  192.                     //Default to 50  
  193.                     colHeader.Width = Math.Max(50, colHeader.Width);  
  194.             }  
  195.   
  196.             listView.EndUpdate();  
  197.         }  
  198.   
  199.     }  
  200. }  


執行結果

篩選出所屬魚類的種類和數量

篩選出所屬湖泊的名稱和數量

篩選出所屬貓的種類和數量

篩選出所屬山的名稱和數量

篩選出所屬樹的名稱和數量


引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4530985
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:C#

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

9喜歡★s1234567 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:貓咪大戰爭 經驗如蜜 超... 後一篇:Windows系統 安裝...

追蹤私訊

作品資料夾

airsky00大家
小屋更新,感謝大家的支持~~看更多我要大聲說17小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】