程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Lambda表達式實現有限狀態機,lambda表達式狀態

Lambda表達式實現有限狀態機,lambda表達式狀態

編輯:C#入門知識

Lambda表達式實現有限狀態機,lambda表達式狀態


實現狀態機有多種模式,其中最靈活而強大的方式是通過遷移表來實現,該方式的缺點之一是需要編寫大量小塊代碼去支持遷移表。而在C#3.0中,可以以一種非常優雅的方式實現。 
除了有限狀態機外,還有有限自動機,有限自動機一般用於分析字符。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StateMachine
{
    class Program
    {
        static void Main(string[] args)
        {
            var door = new Door(State.Open);

            while (true)
            {
                string s = Console.ReadLine();
                Operation op = string.IsNullOrEmpty(s) ? Operation.Push : Operation.Pull;
                door.Process(op);
            }
        }
    }

    enum Operation
    {
        Push, Pull
    }

    enum State
    {
        Open, Closed
    }

    class Door
    {
        public State State { get; set; }

        Dictionary<State, Dictionary<Operation, Action>> rule;
        public Door(State state)
        {
            this.State = state;

            rule = new Dictionary<State, Dictionary<Operation, Action>>();
            foreach (var e in Enum.GetValues(typeof(State)))
            {
                rule[(State)e] = new Dictionary<Operation, Action>();
            }

            InitOperationRule();
        }

        void InitOperationRule()
        {
            //正常操作
            rule[State.Closed][Operation.Push] = () => { Console.WriteLine("門被推開了"); State = State.Open; };
            rule[State.Open][Operation.Pull] = () => { Console.WriteLine("門被拉上了"); State = State.Closed; };

            ////加入幾種特殊情況的處理
            //rule[State.Closed][Operation.Pull] = () => Console.WriteLine("門是關上的,拉了也白拉");
            //rule[State.Open][Operation.Push] = () => Console.WriteLine("門是開的,不用推了,直接進去吧");
        }

        public void Process(Operation op)
        {
            try
            {
                rule[State][op]();
            }
            catch (KeyNotFoundException)
            {

                Console.WriteLine(string.Format("門在{0}狀態下不允許{1}操作", State, op));
            }
            
        }
    }
}

從代碼中可以看到,通過lambda表達式,可以簡化遷移表的構造,並且更加直觀。 
通過遷移表構造狀態機的一種不足在於查詢速度,在本例中每個操作都要進行兩次查詢才能進行狀態轉換操作。如果狀態較多則非常費時,這裡我把它改進了一下,使得每次操作只需要查詢一次即可。 

    class DoorPlus
    {
        State state;
        public State State 
        {
            get { return state; }
            set 
            { 
                if (state != value)
                    currentOpRule = rule[value];
                state = value;
            } 
        }

        Dictionary<Operation, Action> currentOpRule;
        Dictionary<State, Dictionary<Operation, Action>> rule;
        public DoorPlus(State state)
        {
            this.State = state;

            rule = new Dictionary<State, Dictionary<Operation, Action>>();
            foreach (var e in Enum.GetValues(typeof(State)))
            {
                rule[(State)e] = new Dictionary<Operation, Action>();
            }

            currentOpRule = rule[State];

            InitOperationRule();
        }

        void InitOperationRule()
        {
            //正常操作
            rule[State.Closed][Operation.Push] = () => { Console.WriteLine("門被推開了"); State = State.Open; };
            rule[State.Open][Operation.Pull] = () => { Console.WriteLine("門被拉上了"); State = State.Closed; };

            ////加入幾種特殊情況的處理
            //rule[State.Closed][Operation.Pull] = () => Console.WriteLine("門是關上的,拉了也白拉");
            //rule[State.Open][Operation.Push] = () => Console.WriteLine("門是開的,不用推了,直接進去吧");
        }

        public void Process(Operation op)
        {
            try
            {
                currentOpRule[op]();
            }
            catch (KeyNotFoundException)
            {

                Console.WriteLine(string.Format("門在{0}狀態下不允許{1}操作", State, op));
            }
        }
    }


lambda表達式來自什地方?

Lambda表達式(Lambda Expressions)2009-03-06 16:33Lambda 表達式(拉姆達表達式) 和 匿名方法 其實是一件事情。唯一的不同是:他們語法表現形式不同。Lambda 表達式是在語法方面的更進一步的進化。在本質上,他們是一件事情。他們的作用都是:產生方法。即:內聯方法。

引用自 C#首席架構師Anders Hejlsberg 的原話:

www.ondotnet.com/...page=2

lambda expressions and anonymous methods are really just two words for the same thing. The only thing that differs is, "What does the syntax look like?" And the lambda expressions are a further evolution of the syntax.But underneath, they do the same thing. They generate methods. You know, they're in-line methods.

所以:我們要了解 Lambda 表達式 就應該同時也了解 匿名方法。下面先看一個簡單的代碼例子,分別用匿名方法和Lambda 表達式來實現對數組的搜索:

使用 .net 2.0 的匿名方法來搜索字符串數組中包含 a 的字符串數組

static void Main(string[] args)
{
string[] list = new string[] { "abc", "12", "java" };
string[] ll = Array.FindAll(list,
delegate(string s)
{
return s.IndexOf("a") >= 0;
}
);
foreach (string var in ll)
{
Console.WriteLine(var);
}
Console.ReadLine();
}

使用 .net 3.5 的Lambda表達式來搜索字符串數組中包含 a 的字符串數組

static void Main(string[] args)
{
string[] list = new string[] { "abc", "12", "java" };

string[] ll = Array.FindAll(list, s => (s.IndexOf("a") >= 0));
foreach (string var in ll)......余下全文>>
 

C#中 Lambda表達式 與正則表達式的關系

八竿子打不著的關系
lambda表達式是函數式語言的特性,c#利用自身動態編譯的特性才實現這種效果的,可以用它寫匿名函數等.像C,C++神馬的都沒有的.
正則是各語言都有實現的,用來查詢匹配等的
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved