我需要建立一個層次結構,我正在使用字典。當我嘗試構建它時,我隨機讀取字串,它們具有以下格式:
address.city.streetname.housenumber
address.areacode
address.city.streetname.coAddress
我在弄清楚如何填充整個層次結構時遇到問題這就是我所做的:
public class JsonElement
{
public string parent { get; set; }
public string name { get; set; }
public List<JsonElement> childrenJsonElements { get; set; }
}
var dictionaryHierarchy = new Dictionary<string, JsonElement>();
List<string> stringList = new List<string>()
{ "address.city.streetname.housenumber",
"address.areacode",
"address.city.streetname.coAddress"};
foreach(string element in stringList)
{
string[] tagsStringArray = element.Split('.');
if (!dictionaryHierarchy.ContainsKey(tagsStringArray[0]))
{
dictionaryHierarchy.Add(tagsStringArray[0], new JsonElement());
}
dictionaryHierarchy = AddElementsToHierarchy();
}
private static Dictionary<string, JsonElement> AddElementsToHierarchy(Dictionary<string,
JsonElement> dictionaryHierarchy, string element)
{
JsonElement jsonElement = new JsonElement();
string[] tagsStringArray = element.Split('.');
if (tagsStringArray.Length < 2)
{
return dictionaryJsonHierarchy;
}
jsonElement = dictionaryHierarchy[tagsStringArray[0]];
int ix = 1;
while (ix < tagsStringArray.Length)
{
if (jsonElement.name != tagsStringArray[ix])
{
jsonElement.parent = tagsStringArray[ix-1];
jsonElement.name = tagsStringArray[ix];
}
else
{
; // This part is for adding children
}
ix ;
}
return dictionaryHierarchy;
}
uj5u.com熱心網友回復:
您有一個由JsonElement節點組成的樹結構。這個結構是你唯一需要的資料結構。讓我們重新定義JsonElement:
public class JsonElement
{
public string Parent { get; set; }
public string Name { get; set; }
public List<JsonElement> Children { get; } = new List<JsonElement>();
}
我們制作了屬性 PascalCase。這是通常的命名慣例。這Children是一個只讀屬性,帶有一個初始化串列的初始化器。
按照建議,我們添加更多示例:
var input = new[] {
"address.city.streetname.housenumber",
"address.areacode",
"address.city.streetname.coAddress",
"person.name.firstname",
"person.name.lastname"
};
現在,我們在層次結構的開頭有兩個不同的元素。為了啟用這個場景,我們添加了一個帶有null名稱的中性根元素。
var root = new JsonElement();
foreach (string s in input) {
AddElements(root, s.Split('.'));
}
現在,讓我們創建層次結構。
添加元素包括按照標簽(名稱)沿著樹結構向下移動。如果缺少一個,我們添加它。
private static void AddElements(JsonElement node, string[] elements)
{
foreach (string element in elements) {
var child = node.Children.Find(child => child.Name == element);
if (child == null) {
child = new JsonElement {
Parent = node.Name,
Name = element
};
node.Children.Add(child);
}
node = child; // Walk down the tree
}
}
我們可以用這個遞回方法測驗結果:
private static void PrintChildren(JsonElement node, int level = 0)
{
string indent = new String(' ', 4 * level);
foreach (var child in node.Children) {
Console.WriteLine($"{indent}{child.Name}, Parent = {child.Parent}");
PrintChildren(child, level 1);
}
}
用它呼叫PrintChildren(root);列印:
address, Parent =
city, Parent = address
streetname, Parent = city
housenumber, Parent = streetname
coAddress, Parent = streetname
areacode, Parent = address
person, Parent =
name, Parent = person
firstname, Parent = name
lastname , Parent = name
也可以看看:
- 資料結構和演算法 - 樹
- 樹(資料結構)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496875.html
上一篇:比較兩個字典串列并獲得差異
