第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

IEnumerable和使用收益回報的遞歸

IEnumerable和使用收益回報的遞歸

C#
慕斯709654 2019-11-25 14:38:36
我有一種IEnumerable<T>用于在WebForms頁面中查找控件的方法。該方法是遞歸的,當(dāng)返回yield return值為遞歸調(diào)用的值時,在返回所需的類型時遇到一些問題。我的代碼如下所示:    public static IEnumerable<Control>                                GetDeepControlsByType<T>(this Control control)    {        foreach(Control c in control.Controls)        {            if (c is T)            {                yield return c;            }            if(c.Controls.Count > 0)            {                yield return c.GetDeepControlsByType<T>();            }        }    }當(dāng)前,這將引發(fā)“無法轉(zhuǎn)換表達(dá)式類型”錯誤。但是IEnumerable<Object>,如果此方法返回type ,則代碼會生成,但是在輸出中返回了錯誤的類型。有沒有yield return同時使用遞歸的使用方法?
查看完整描述

3 回答

?
慕無忌1623718

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個贊

在返回的方法內(nèi)IEnumerable<T>,yield return必須返回T,而不是返回IEnumerable<T>。


更換


yield return c.GetDeepControlsByType<T>();

與:


foreach (var x in c.GetDeepControlsByType<T>())

{

  yield return x;

}


查看完整回答
反對 回復(fù) 2019-11-25
?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個贊

您需要產(chǎn)生遞歸調(diào)用產(chǎn)生的每個項(xiàng)目:


public static IEnumerable<Control> GetDeepControlsByType<T>(this Control control)

{

    foreach(Control c in control.Controls)

    {

        if (c is T)

        {

            yield return c;

        }


        if(c.Controls.Count > 0)

        {

            foreach (Control control in c.GetDeepControlsByType<T>())

            {

                yield return control;

            }

        }

    }

}

請注意,以這種方式進(jìn)行遞歸會產(chǎn)生成本-您最終將創(chuàng)建大量的迭代器,如果您的控制樹非常深,則可能會導(dǎo)致性能問題。如果要避免這種情況,則基本上需要在方法中自己進(jìn)行遞歸,以確保僅創(chuàng)建一個迭代器(狀態(tài)機(jī))。有關(guān)更多詳細(xì)信息和示例實(shí)現(xiàn),請參見此問題 -但這顯然也增加了一定數(shù)量的復(fù)雜性。


查看完整回答
反對 回復(fù) 2019-11-25
  • 3 回答
  • 0 關(guān)注
  • 468 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號