諮詢區
-
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(2020, 8, 8)
},
new Record()
{
id = 2,
name = "def",
date = new DateTime(2020, 8, 9)
},
new Record()
{
id = 1,
name = "def",
date = new DateTime(2020, 8, 9)
}
};
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 { get; set; }
public string name { get; set; }
public DateTime date { get; set; }
}
點評區
這道題目非常好,很好的解釋瞭如何靈活運用 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源創計劃”,歡迎正在閱讀的你也加入,一起分享。