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

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

如何通過LINQ將樹夷為平地?

如何通過LINQ將樹夷為平地?

搖曳的薔薇 2019-06-26 13:30:01
如何通過LINQ將樹夷為平地?所以我有一棵簡單的樹:class MyNode{  public MyNode Parent;  public IEnumerable<MyNode> Elements;  int group = 1;}我有一個IEnumerable<MyNode>..我想要一份清單MyNode(包括內(nèi)部節(jié)點對象(Elements)作為一個單一清單Where group == 1..如何通過LINQ做這樣的事情?
查看完整描述

3 回答

?
縹緲止盈

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

你可以像這樣把一棵樹夷為平地:

IEnumerable<MyNode> Flatten(IEnumerable<MyNode> e) {
    return e.SelectMany(c => Flatten(c.Elements)).Concat(new[] {e});}

然后你可以過濾group使用Where(...).

若要獲得“風(fēng)格積分”,請轉(zhuǎn)換Flatten到靜態(tài)類中的擴(kuò)展函數(shù)。

public static IEnumerable<MyNode> Flatten(this IEnumerable<MyNode> e) {
    return e.SelectMany(c => c.Elements.Flatten()).Concat(e);}

為了獲得“更好的風(fēng)格”的一些分?jǐn)?shù),轉(zhuǎn)換Flatten獲取樹和生成后代的函數(shù)的泛型擴(kuò)展方法:

public static IEnumerable<T> Flatten<T>(
    this IEnumerable<T> e,
    Func<T,IEnumerable<T>> f) {
    return e.SelectMany(c => f(c).Flatten(f)).Concat(e);}

這樣調(diào)用此函數(shù):

IEnumerable<MyNode> tree = ....var res = tree.Flatten(node => node.Elements);

如果您希望按預(yù)先順序而不是按順序排列,請在Concat(...).


查看完整回答
反對 回復(fù) 2019-06-26
?
手掌心

TA貢獻(xiàn)1942條經(jīng)驗 獲得超3個贊

為了完整起見,下面是dasbrakenlight和EricLippert的答案的組合。單元測試和一切。*-)

 public static IEnumerable<T> Flatten<T>(
        this IEnumerable<T> items,
        Func<T, IEnumerable<T>> getChildren)
 {
     var stack = new Stack<T>();
     foreach(var item in items)
         stack.Push(item);

     while(stack.Count > 0)
     {
         var current = stack.Pop();
         yield return current;

         var children = getChildren(current);
         if (children == null) continue;

         foreach (var child in children) 
            stack.Push(child);
     }
 }


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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