範例一 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年8月23日 星期六
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] + " ";
}
}
}
}
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>得意思是一個委派
而語法如下
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>
訂閱:
文章 (Atom)