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