最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)遞歸調(diào)用的Lambda表達(dá)式

 更新時(shí)間:2022年06月18日 10:07:22   作者:天方  
這篇文章介紹了C#實(shí)現(xiàn)遞歸調(diào)用的Lambda表達(dá)式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前段時(shí)間,我寫(xiě)一個(gè)樹(shù)的訪(fǎng)問(wèn)算法的時(shí)候,用了Visitor模式把訪(fǎng)問(wèn)的算法分離了出來(lái),當(dāng)時(shí)打算用lambda表達(dá)式寫(xiě)visit算法的,卻發(fā)現(xiàn)帶遞歸調(diào)用的lambda表達(dá)式?jīng)]想象的那么好寫(xiě),憋了半天愣是沒(méi)寫(xiě)出來(lái),由于當(dāng)時(shí)趕進(jìn)度,就寫(xiě)成了普通的函數(shù)了。

今天晚上研究了一下遞歸調(diào)用的Lambda表達(dá)式的寫(xiě)法,發(fā)現(xiàn)也還是比較簡(jiǎn)單的,就是腦袋要轉(zhuǎn)個(gè)彎(可能當(dāng)時(shí)這個(gè)彎沒(méi)有轉(zhuǎn)過(guò)來(lái)),首先給一個(gè)簡(jiǎn)單的示例:

    int i = 1;
    RecursiveRun(self =>
        {
            Console.WriteLine("hello world " + i++);
            self();
        });

    static void RecursiveRun(Action<Action> action)
    {
        action(() => RecursiveRun(action));
    }

可能有人說(shuō)函數(shù)RecursiveRun是無(wú)參數(shù)的,基本上沒(méi)什么用,下面這個(gè)就是帶一個(gè)參數(shù)的版本了(如果需要更多的參數(shù)的版本,直接把RecursiveRun函數(shù)稍稍修改即可):

    static void RecursiveRun<T>(T obj, Action<T, Action<T>> action)
    {
        action(obj, o => RecursiveRun(o, action));
    }

通過(guò)這個(gè)函數(shù),就可以把二叉樹(shù)的遍歷算法用lambda表達(dá)式給表示出來(lái)了:

    class BinTree
    {
        public int Value { get; set; }
        public BinTree Left { get; set; }
        public BinTree Right { get; set; }

        public BinTree(int value)
        {
            this.Value = value;
        }

        public void Accept(Action<BinTree> visitor)
        {
            visitor(this);
        }

        public void Accept(Action<BinTree, Action<BinTree>> visitor)
        {
            visitor(this, node => node.Accept(visitor));
        }

        public override string ToString()
        {
            return Value.ToString();
        }
    }

    var nodes = Enumerable.Range(0, 5).Select(i => new BinTree(i)).ToArray();

    nodes[0].Left = nodes[1];
    nodes[0].Right = nodes[2];
    nodes[1].Left = nodes[3];
    nodes[1].Right = nodes[4];

    nodes[0].Accept((node, visitor) =>
        {
            Console.WriteLine(node.Value);
            if (node.Left != null)
                visitor(node.Left);
            if (node.Right != null)
                visitor(node.Right);
        });

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

疏勒县| 肥东县| 朔州市| 靖西县| 南涧| 军事| 民勤县| 驻马店市| 昭觉县| 蛟河市| 万源市| 河曲县| 西平县| 图木舒克市| 达拉特旗| 额尔古纳市| 昭苏县| 虹口区| 汨罗市| 东至县| 宁都县| 鄂托克前旗| 永平县| 汉寿县| 东平县| 旅游| 堆龙德庆县| 喀喇| 贺州市| 大冶市| 库车县| 新泰市| 潞西市| 屯门区| 海林市| 维西| 连云港市| 凌云县| 中西区| 温宿县| 绥德县|