将父母,孩子,祖儿数据存储在内存中

时间:2016-08-04 12:12:29

标签: c# dictionary data-structures nested directory-structure

我正在寻找最简单的方法来将父子数据存储在内存中以进行操作。将有大约100名父母,20名儿童和30名大孩子,只有父母的数量会发生变化,所有儿童和大儿童的房产在编制之前都会知道。我想使用父ID和属性名作为键来访问grand children数据。我可以使用一个具有200多个属性的简单类,但我确信这是一种更有效的方法。

我遇到嵌套的dictionaries / classes / structures / 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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

为此,我将使用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>