gpt4 book ai didi

c# - 将父、子、孙数据存储在内存中

转载 作者:太空宇宙 更新时间:2023-11-03 21:09:17 25 4
gpt4 key购买 nike

我正在寻找将父子数据存储在内存中以供操作的最简单方法。将有大约 100 个 parent 、20 个 child 和 30 个孙子,只有 parent 的数量会发生变化,所有子孙属性在编译前都是已知的。我想使用父 ID 和属性名称作为键来访问孙子数据。我可以使用具有 200 个奇数属性的简单类,但我确信有更有效的方法。

我遇到过嵌套 dictionaries/类/结构/tuples 、列表列表、数组列表、json、非二叉树等,但大多数帖子都有好几年了,我不确定哪种方法最好。

谁能建议使用哪种方法,或者是否有可用的好库?

    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

最佳答案

我将从一个简单、标准的方法开始:为结构定义一个类,并为子节点使用列表集合,并使用方便的构造器来分配父节点。

 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);

继承示例

子类

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 毫秒

关于c# - 将父、子、孙数据存储在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38766996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com