2014年8月23日 星期六

選寫網路程式基礎常用物件

範例一  NET 常用的物件

//用於存取IP的 IPAddress
            IPAddress ip = IPAddress.Parse("192.168.1.143");
            Console.WriteLine("MyIp=" + ip);
//存取IP跟 PORT,將網路端點表示成 IP 位址和通訊埠編號。
            IPEndPoint Port = new IPEndPoint(ip, 80);
            Console.WriteLine("the port is=" + Port);
 // IPEndPoint.Serizlize()  將端點資訊序列化為 SocketAddress 執行個體。
//疑問? 話說序列化為 SocketAddress  能幹啥?
            SocketAddress Soket = Port.Serialize();
            Console.WriteLine("socketAddr=" + Soket);
//印出 socketAddr {InterNetwork:16:{0,80,192,168,1,143,0,0,0,0,0,0,0,0}}
            Console.ReadLine();//




           
範例二  用IP來取得主機名稱

//範例IP yahoo: 192.168.1.143 名子是JASON-PC
            IPAddress ipAddr = IPAddress.Parse("192.168.1.143");
 // 透過DNS找尋IP位址相對應之主機名稱
            IPHostEntry remoteHostEntry = Dns.GetHostEntry(ipAddr);  
 //呼叫IPHostEntry中的HostName及可取得 HOST的 NAME
            Console.WriteLine("host of ip " + ipAddr + " is " + remoteHostEntry.HostName);
            Console.ReadLine();
//印出JASON-PC







範例三   使用 DNS 查詢 IP

 //可輸入本機號碼 Jason-PC 將獲得IP: 192.168.1.143
//也可以輸入tw.yahoo.com 將獲得IP: 202.43.192.109
            string DoMainName = "tw.yahoo.com";
            IPHostEntry hostEntry = Dns.GetHostEntry(DoMainName);
 // 由於主機有可能有一個以上的 (別名)Alias      
// 因此程式中以迴圈方式判斷 Aliases
            string[] aliasList = hostEntry.Aliases;
            for (int i = 0; i <= aliasList.Length - 1; i++)
            {
                Console.WriteLine("Alias " + i + " : " + aliasList[i]);
            }      
 // 由於主機有可能有一個以上的 IP Address
 // 因此程式中以迴圈方式判斷 AddressList
            IPAddress[] addrList = hostEntry.AddressList;//DNS轉IP

            for (int i = 0; i <= addrList.Length - 1; i++)
            {
                Console.WriteLine("Address " + i + " : " + addrList[i]);
            }
            Console.ReadLine();



範例四:剖析網址 URL
            // 由於 DOS 的命令列會以 & 符號做命令分隔字元,因此、若以指令模式下,網址中的 & 之後會被視為是下一個指令
            System.Uri URL = new System.Uri("http://findbook.tw/search?keyword_type=keyword&t=xxx");
            //        System.Uri URL = new System.Uri(args[0]);
            // System.Uri類別之屬性
            Console.WriteLine("AbsolutePath: " + URL.AbsolutePath);
            Console.WriteLine("AbsoluteUri: " + URL.AbsoluteUri);
            Console.WriteLine("Authority: " + URL.Authority);
            Console.WriteLine("Host: " + URL.Host);
            Console.WriteLine("Port: " + URL.Port);
            Console.WriteLine("LocalPath: " + URL.LocalPath);
            Console.WriteLine("IsDefaultPort: " + URL.IsDefaultPort);
            Console.WriteLine("IsFile: " + URL.IsFile);
            Console.WriteLine("PathAndQuery: " + URL.PathAndQuery);
            Console.WriteLine("Query: " + URL.Query);
            Console.WriteLine("Scheme: " + URL.Scheme);
            Console.WriteLine("UserEscaped: " + URL.UserEscaped);
            Console.WriteLine("UserInfo: " + URL.UserInfo);
            Console.ReadLine();





//結語
//微軟 C# 的 IP 層物件主要是 IPAddress 與 IPEndPoint,
//另外 IPHostEntry可以用來代表 URL,也可以用 Dns.GetHostEntry()
//查詢主機名稱。這些是 C# 較常使用的 IP 層物件。


2014年5月6日 星期二

插入陣列元素與Array.GetUpperBound取維度最後一個索引

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AddElementInArray
{
    public partial class Frm_Main : Form
    {
        public Frm_Main()
        {
            InitializeComponent();
        }
        private int[] G_int_array = new int[8];//定義全域陣列類型變數
        /// <summary>
        /// 插入單個陣列元素的方法
        /// </summary>
        /// <param name="ArrayBorn">要向其中新增元素的一維陣列</param>
        /// <param name="Index">新增(索引)</param>
        /// <param name="Value">新增值(元素)</param>
        /// <returns>一個新的陣列TemArray</returns>
        static int[] AddArray(int[] ArrayBorn, int Index, int Value)
        {
            if (Index >= (ArrayBorn.Length))//判斷新增索引是否大於陣列的長度
                Index = ArrayBorn.Length - 1;//將新增索引設定為陣列的最大索引
            int[] TemArray = new int[ArrayBorn.Length + 1];//聲明一個新的陣列
            for (int i = 0; i < TemArray.Length; i++)//深度搜尋新陣列的元素
            {
                if (Index >= 0)//判斷新增索引是否大於等於0
                {
                    if (i < (Index + 1))//判斷深度搜尋到的索引是否小於新增索引加1
                        TemArray[i] = ArrayBorn[i];//交換元素值
                    else if (i == (Index + 1))//判斷深度搜尋到的索引是否等於新增索引加1
                        TemArray[i] = Value;//為深度搜尋到的索引設定新增值
                    else
                        TemArray[i] = ArrayBorn[i - 1];//交換元素值
                }
                else
                {
                    if (i == 0)//判斷深度搜尋到的索引是否為0
                        TemArray[i] = Value;//為深度搜尋到的索引設定新增值
                    else
                        TemArray[i] = ArrayBorn[i - 1];//交換元素值
                }
            }
            return TemArray;//返回插入元素後的新陣列
        }

        private void btn_RArray_Click(object sender, EventArgs e)
        {
            txt_RArray.Clear();//清空文字框
            //使用循環賦值 ps:.GetUpperBound 陣列索引最大值+1
            for (int i = 0; i < G_int_array.GetUpperBound(0) + 1; i++)
            {
                G_int_array[i] = i; //加入元素
            }
            //使用循環輸出
            for (int i = 0; i < G_int_array.GetUpperBound(0) + 1; i++)
            {
                txt_RArray.Text += G_int_array[i] + " ";//印出
            }
        }

        private void btn_Sure_Click(object sender, EventArgs e)
        {
            rtbox_NArray.Clear();//清空文字框
            //全域陣列G_int_array   插入第4個索引  插入的元素直txt_Element.Text
            G_int_array = AddArray(G_int_array, 4, Convert.ToInt32(txt_Element.Text));//呼叫自定義方法向陣列中插入單個元素
            //使用循環輸出
            for (int i = 0; i < G_int_array.GetUpperBound(0) + 1; i++)
            {
                rtbox_NArray.Text += G_int_array[i] + " ";
            }
        }
    }
}

Array.FindAll使用FindAll方法搜尋陣列相應字串

來看書上的範例

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FindStr
{
    public partial class Frm_Main : Form
    {
        public Frm_Main()
        {
            InitializeComponent();
        }

        private string[] G_str_array;//宣告一個陣列,尚未實體化及加入元素

        private void Frm_Main_Load(object sender, EventArgs e)
        {
            //下面實體化並加入元素提供user查詢字串 有4個
            G_str_array = new string[] {//為字串陣列欄位賦值
            "明日科技","C#編程詞典","C#範例大全","C#範例寶典"};
            //循環輸出字串到lable上 本範例lable叫lab_Message
            for (int i = 0; i < G_str_array.Length; i++)
            {
                lab_Message.Text += G_str_array[i] + "\n";
            }
        }

        //下面是一個textbox的觸發事件,每輸入一個字將觸發程式區塊
        private void txt_find_TextChanged(object sender, EventArgs e)
        {
            if (txt_find.Text != string.Empty)//判斷搜尋字串是否為空
            {
                string[] P_str_temp = Array.FindAll//使用FindAll方法搜尋相應字串
                    (G_str_array, s => s.Contains(txt_find.Text));

                if (P_str_temp.Length > 0)//判斷是否搜尋到相應字串
                {
                    txt_display.Clear();//清空控制元件中的字串
                    foreach (string s in P_str_temp)//向控制元件中新增字串
                    {
                        txt_display.Text += s + Environment.NewLine;
                    }
                }
                else
                {
                    txt_display.Clear();//清空控制元件中的字串
                    txt_display.Text = "沒有找到記錄";//提示沒有找到記錄
                }
            }
            else
            {
                txt_display.Clear();//清空控制元件中的字串
            }
        }


需要注意的是 使用FindAll方法
中的第一個參數為 搜尋目標的陣列
第二個參數必須要是一個 Predicate<T>
這個Predicate<T>得意思是一個委派
而語法如下
public delegate bool Predicate<in T>(T obj)
注意的是傳回值是一個BOOL
也就是說我們也可以自訂函式只要傳回值是一個BOOL就好
所以上面範例使用Contains方法傳回直是Bool
比較S與txt_find.Text是否一樣是的話就回傳true
然後FindAll再回傳該陣列中的字
而需要注意的是通常, Predicate<T> 委派由 Lambda 運算式表示。

關於LAMBDA 下面有例子可以複習

        delegate int count(int x, int y); //宣告一個委派叫COUNT

        //宣告加減乘除的方法 傳回值是一個結果
        private int ADDD(int x, int y)
        {
            return x + y;
        }
        private int CUT(int x, int y)// 
        {
            return x - y;
        }
        private int XX(int x, int y)
        {
            return x * y;
        }


        private void button1_Click(object sender, EventArgs e)
        {
            //傳統委派實體化 帶入ADDD
            count c1 = new count(ADDD);
            //加入var 表示後面的count
            var c2 = new count(CUT);
            //值街只向xx方法 更精簡
            count c3 = XX;
            //使用匿名方式 不用指向任何方法
            count c4 = delegate(int x, int y) { return x + y; };
            //lambda方法 
            count c5 = (A, B) => A + B;
            //宣告string空字串 放答案用
            string ANSER = "";
            //anser+=順便帶入參數
            ANSER += c1(1, 1) + "\n";
            ANSER += c2(1, 1) + "\n";
            ANSER += c3(1, 1) + "\n";
            ANSER += c4(1,1)+"\n";
            ANSER += c5(1,1);
            //show出
            MessageBox.Show(ANSER);
            //答案是2 0 1 2 2


2014年4月12日 星期六

GetUpperBound()方法來取得Array陣列維度上限

注意 GetUpperBound() 起始維度0開始所以要+1

範例如下

public partial class Frm_Main : Form
    {
        public Frm_Main()
        {
            InitializeComponent();
        }
        private string[,] G_str_array;//定義全域陣列類型變數
        private Random G_Random_Num = new Random();//產生全域隨機數物件
        private void btn_GetArray_Click(object sender, EventArgs e)
        {
            txt_display.Clear();//清空控制元件中的字串
            G_str_array = new string[//隨機產生二維陣列
                G_Random_Num.Next(2, 10),//2~10隨機範圍
                G_Random_Num.Next(2, 10)];//2~10隨機範圍
            lab_Message.Text = string.Format(
                "產生了 {0} 行 {1 }列 的陣列",
                G_str_array.GetUpperBound(0) + 1,//取得陣列的行數
                G_str_array.GetUpperBound(1) + 1);//取得陣列的列數
            DisplayArray();//呼叫顯示陣列方法
        }
        private void DisplayArray()
        {
            //使用循環賦值
            for (int i = 0; i < G_str_array.GetUpperBound(0) + 1; i++)
            {
                for (int j = 0; j < G_str_array.GetUpperBound(1) + 1; j++)
                {
                    //將維度字串寫入陣列
                    G_str_array[i, j] = i.ToString() + "," + j.ToString() + "  ";
                }
            }
            //使用循環輸出
            for (int i = 0; i < G_str_array.GetUpperBound(0) + 1; i++)
            {
                for (int j = 0; j < G_str_array.GetUpperBound(1) + 1; j++)
                {
                    txt_display.Text += G_str_array[i, j];
                }
                txt_display.Text += Environment.NewLine;//換行
            }
        }
    }<\CODE>