2014年5月6日 星期二

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


沒有留言:

張貼留言