NET問答:如何將一維 list 轉成嵌套 list ?

諮詢區

  • vsrp demo

我在 .NET 和 C# 領域是一個新手,現在碰到了一個難題,如何將一維的 list 轉成 嵌套的 list,現在在這裏卡住了,如下結構:


[
    {
        id: 1,
        name: "abc",
        date: "8/8/20"
    },
    {
        id: 2,
        name: "xyz",
        date: "9/8/20"
    },
    {
        id: 1,
        name: "def",
        date: "9/8/20"
    }
]

現在我想把它轉成如下的嵌套格式。


[
    {
        id: 1,
        nameList: [
            {
                name: "abc",
                date: "8/8/20"
            },
            {
                name: "def",
                date: "9/8/20"
            }
        ]
    },
    {
        id: 2,
        nameList: [
            {
                name: "abc",
                date: "8/8/20"
            }
        ]
    }
]

能否有人幫我解答一下,先謝謝了。

回答區

  • vc 74

你可以使用 Linq's GroupBy 來解決這個問題。


List<Record> records =...

IEnumerable<IGrouping<int, Record>> groups = records.GroupBy(r => r.id);

請注意,這個 groups 它不是一個 list,如果你想把它打印出來,可以像下面這樣寫。


var nested = records.GroupBy(r => r.id).Select(g =>
    new
    {
       id = g.Key,
       nameList = g.Select(cr =>
       new 
       {
         name = cr.name,
         date = cr.date
       }).ToList()
    }).ToList());

下面是僅供參考的完整代碼,可以使用 C# 的在線工具:https://dotnetfiddle.net/2AEbv9


    public class Program
    {
        static void Main(string[] args)
        {
            var records = new List<Record>()
                          {
                              new Record()
                              {
                                  id = 1,
                                  name = "abc",
                                  date = new DateTime(202088)
                              },
                              new Record()
                              {
                                  id = 2,
                                  name = "def",
                                  date = new DateTime(202089)
                              },
                              new Record()
                              {
                                  id = 1,
                                  name = "def",
                                  date = new DateTime(202089)
                              }
                          };

            var nested = records.GroupBy(r => r.id).Select(g =>
                                  new
                                  {
                                      id = g.Key,
                                      nameList = g.Select(cr =>
                                      new
                                      {
                                          name = cr.name,
                                          date = cr.date
                                      }).ToList()
                                  }).ToList();

            foreach (var parent in nested)
            {
                Console.WriteLine($" id={parent.id}");

                foreach (var child in parent.nameList)
                {
                    Console.WriteLine($"\tname={child.name}");
                    Console.WriteLine($"\tdate={child.date}");
                }
            }

        }
    }

    public class Record
    {
        public int id { getset; }
        public string name { getset; }
        public DateTime date { getset; }
    }

點評區

這道題目非常好,很好的解釋瞭如何靈活運用 Linq,我相信有很多做過報表業務的同學深有體會,經常需要將一坨數據進行 升維降維,前者必用:GroupBy(), Dictionary(),ToLookup() 等方法,後者必用 SelectMany()

這裏我就拿樓主提的問題舉個例子吧,既然是按照 id 進行分組,業務開發中,我更多的會將其轉爲 Dictionary 結構,這樣查找 id 就是 O(1) 的時間複雜度,改造後的代碼如下:


            var query = records.GroupBy(g => g.id).ToDictionary(k => k.Key, v => v.Select(m => new
            {
                name = m.name,
                date = m.date
            }).ToList());

            var json = JsonConvert.SerializeObject(query, Formatting.Indented);

            Console.WriteLine(json);

原文鏈接:https://stackoverflow.com/questions/63508442/converting-flat-list-of-objects-into-a-nested-list-of-objects-in-c-sharp


本文分享自微信公衆號 - 一線碼農聊技術(dotnetfly)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章