在内存中存储 parent、child、grand- child 数据
store parent, child, grand- child data in memory
我正在寻找最简单的方法来将 parent child 数据存储在内存中以供操作。将有大约 100 parents,20 children 和 30 grand-children,只有 parents 的数量会改变,所有 child 和 grand-child 属性将在编译前已知。我想使用 parent ID 和 属性 名称作为键访问宏大的 children 数据。我可以使用具有 200 个奇数属性的简单 class,但我确信有更有效的方法。
我遇到过嵌套的 dictionaries/classes/structures/tuples、列表的列表、数组的列表、json、non-binary 树等,但大多数帖子都是几年前的,我不是确定哪种方法最好。
谁能建议使用哪种方法,或者是否有可用的好库?
ID (1 to 100)
|
param 1 param 2 param 3 param 4.....param 20
-val 1 -val 1 -val 1 -val 1 -val 1
-val 2 -val 2 -val 2 -val 2 -val 2
-val 3 -val 3 -val 3 -val 3 -val 3
...
-val 30 -val 30 -val 30 -val 30 -val 30
我将从一个简单、标准的方法开始:
为 树 结构定义一个 class 并为子节点使用一个列表集合和一个方便的构造器来分配父节点。
public class Node
{
public List<Node> children = new List<Node>();
public string Name;
public int? Val;
public Node Parent = null;
public Node(string name, int? val, Node fromParent = null) {
Name = name;
Val = val;
if (fromParent != null)
{
Parent = fromParent;
fromParent.children.Add(this);
}
}
}
一个简单的用法:
var parent1 = new Node("parent1",10);
var child1 = new Node("child", 30, parent1);
继承示例
亚class亚
public class Root : Node
{
public int ParentID;
public Root(int id) : base(null, null, null)
{
ParentID = id;
}
}
public class Parameter : Node
{
public string ParameterType;
public Parameter(string paramName, string paramType, Node fromParent = null) : base(paramName, null, fromParent)
{
ParameterType = paramType;
}
}
public class Value : Node
{
public string Unit;
public Value(int val, string unit, Node fromParent = null) : base(null, val, fromParent)
{
Unit = unit;
}
}
以及如何实例化它们(使用随机值)
List<Node> parents = new List<Node>();
Random rnd = new Random();
for (int k = 0; k < 100; k++)
{
var parentk = new Root(k);
for (int kk = 0; kk < 20; kk++)
{
var paramkk = new Parameter("simple" + kk, "param1", parentk);
for (int kkk = 0; kkk < 30; kkk++)
{
int dice = rnd.Next(1, 1000000);
var valkkk = new Value(dice, "bar", paramkk);
}
}
parents.Add(parentk);
}
内存中搜索
假设您有上述 parents
的集合,您想要找到 param1
的最大值
DateTime start = DateTime.Now;
var mySearch = parents.SelectMany(x => x.children)
.Where(x => ((Parameter)x).ParameterType == "param1")
.GroupBy(x => x.Parent,
x => x.children,
(key, gr) =>
new
{
Key = key,
MaxVal = gr.Max(y => y.Max(z => z.Val))
}).OrderByDescending(x => x.MaxVal).First();
var foundID = ((Root)mySearch.Key).ParentID;
DateTime stop = DateTime.Now;
var elapsed = (stop - start).TotalMilliseconds;
并且此搜索在我的笔记本电脑上花费了大约 15 毫秒
为此,我将使用 XML 树。
有两种选择:
XDocument 比使用其他方法简单得多。您可以在 this answer.
中看到差异
这是一个使用 XDocument 的示例:
var data =
new XElement("root",
new XElement("parent",
new XElement("child",
new XElement("grandchild"),
new XElement("grandchild"),
new XElement("grandchild"),
//optionally you can add attributes such as Age or ID
new XElement("grandchild",
new XAttribute("Age","16"), new XAttribute("ID", "47"))
)
)
);
您可以将其作为 XML 文件保存并打开,如下所示:
var filePath = @"C:\XDocumentTest.xml";
using (var fileStream = new FileStream(filePath, FileMode.Create))
using (var writer = new StreamWriter(fileStream))
{
writer.Write(data);
}
System.Diagnostics.Process.Start(filePath);
文件的外观如下:
<root>
<parent>
<child>
<grandchild />
<grandchild />
<grandchild />
<grandchild Age="16" ID="47" />
</child>
</parent>
</root>
我正在寻找最简单的方法来将 parent child 数据存储在内存中以供操作。将有大约 100 parents,20 children 和 30 grand-children,只有 parents 的数量会改变,所有 child 和 grand-child 属性将在编译前已知。我想使用 parent ID 和 属性 名称作为键访问宏大的 children 数据。我可以使用具有 200 个奇数属性的简单 class,但我确信有更有效的方法。
我遇到过嵌套的 dictionaries/classes/structures/tuples、列表的列表、数组的列表、json、non-binary 树等,但大多数帖子都是几年前的,我不是确定哪种方法最好。
谁能建议使用哪种方法,或者是否有可用的好库?
ID (1 to 100)
|
param 1 param 2 param 3 param 4.....param 20
-val 1 -val 1 -val 1 -val 1 -val 1
-val 2 -val 2 -val 2 -val 2 -val 2
-val 3 -val 3 -val 3 -val 3 -val 3
...
-val 30 -val 30 -val 30 -val 30 -val 30
我将从一个简单、标准的方法开始: 为 树 结构定义一个 class 并为子节点使用一个列表集合和一个方便的构造器来分配父节点。
public class Node
{
public List<Node> children = new List<Node>();
public string Name;
public int? Val;
public Node Parent = null;
public Node(string name, int? val, Node fromParent = null) {
Name = name;
Val = val;
if (fromParent != null)
{
Parent = fromParent;
fromParent.children.Add(this);
}
}
}
一个简单的用法:
var parent1 = new Node("parent1",10);
var child1 = new Node("child", 30, parent1);
继承示例
亚class亚
public class Root : Node
{
public int ParentID;
public Root(int id) : base(null, null, null)
{
ParentID = id;
}
}
public class Parameter : Node
{
public string ParameterType;
public Parameter(string paramName, string paramType, Node fromParent = null) : base(paramName, null, fromParent)
{
ParameterType = paramType;
}
}
public class Value : Node
{
public string Unit;
public Value(int val, string unit, Node fromParent = null) : base(null, val, fromParent)
{
Unit = unit;
}
}
以及如何实例化它们(使用随机值)
List<Node> parents = new List<Node>();
Random rnd = new Random();
for (int k = 0; k < 100; k++)
{
var parentk = new Root(k);
for (int kk = 0; kk < 20; kk++)
{
var paramkk = new Parameter("simple" + kk, "param1", parentk);
for (int kkk = 0; kkk < 30; kkk++)
{
int dice = rnd.Next(1, 1000000);
var valkkk = new Value(dice, "bar", paramkk);
}
}
parents.Add(parentk);
}
内存中搜索
假设您有上述 parents
的集合,您想要找到 param1
DateTime start = DateTime.Now;
var mySearch = parents.SelectMany(x => x.children)
.Where(x => ((Parameter)x).ParameterType == "param1")
.GroupBy(x => x.Parent,
x => x.children,
(key, gr) =>
new
{
Key = key,
MaxVal = gr.Max(y => y.Max(z => z.Val))
}).OrderByDescending(x => x.MaxVal).First();
var foundID = ((Root)mySearch.Key).ParentID;
DateTime stop = DateTime.Now;
var elapsed = (stop - start).TotalMilliseconds;
并且此搜索在我的笔记本电脑上花费了大约 15 毫秒
为此,我将使用 XML 树。
有两种选择:
XDocument 比使用其他方法简单得多。您可以在 this answer.
中看到差异这是一个使用 XDocument 的示例:
var data =
new XElement("root",
new XElement("parent",
new XElement("child",
new XElement("grandchild"),
new XElement("grandchild"),
new XElement("grandchild"),
//optionally you can add attributes such as Age or ID
new XElement("grandchild",
new XAttribute("Age","16"), new XAttribute("ID", "47"))
)
)
);
您可以将其作为 XML 文件保存并打开,如下所示:
var filePath = @"C:\XDocumentTest.xml";
using (var fileStream = new FileStream(filePath, FileMode.Create))
using (var writer = new StreamWriter(fileStream))
{
writer.Write(data);
}
System.Diagnostics.Process.Start(filePath);
文件的外观如下:
<root>
<parent>
<child>
<grandchild />
<grandchild />
<grandchild />
<grandchild Age="16" ID="47" />
</child>
</parent>
</root>