如何在c#中存储分层数据

本文关键字:存储 分层 数据 | 更新日期: 2023-09-27 18:11:50

我想在控制台应用程序中存储汽车的所有品牌和型号。

所以我可以像这样打印它们:

     - Toyota
         Corolla      
         Camry  
         ...
     - Nissan
        Altima  
        Sentra  
        ...

我假设我需要某种层次数据。我在考虑制作《课堂制作》和《课堂模型》。Make有一个模型列表。然后是make的列表。但这看起来过于复杂了。这类事情的最佳解决方案是什么?

如何在c#中存储分层数据

这取决于你所说的"store"是什么意思。在磁盘吗?在应用程序的内存中?

数据库适合持久化存储这类东西。如果这看起来有点夸张,但又需要存储在磁盘上,那么可以使用CSV或XML文件。如果你想让它内置到你的应用程序中,你可以通过编程方式创建它,但最好嵌入一个资源并将其读入合适的结构(见下文).

根据你在应用程序/程序中要做的事情,有许多,许多,许多方法来存储和表示这些数据。一个对象图(使用类,继承等),一个数据集,一个树,…

这取决于make和models对你的应用意味着什么,如果它们只是字符串,那么你可以使用像dictionary<string,list<string>>这样的列表字典,字典的键将是make,值是模型列表

想到的最简单的内存存储是Dictionary<string, List<string>>,您可以用从make到模型列表的映射填充它。请注意,如果您想知道给定模型与什么make(s)相关联,那么这不是那么方便,因此在确定结构之前了解常见的使用模式非常重要。

如果你想把它存储在数据库中,那么你必须考虑一个模式,可能是这样的:

Make  ( MakeName,
        PRIMARY KEY MakeName )
Model ( MakeName,
        ModelName,
        FOREIGN KEY MakeName REFERENCES Make(MakeName),
        PRIMARY KEY (MakeName, ModelName) )
class CarModel {
    public CarModel(string name){
        CarModelName = name;
        CarSubModels = new IList<CarModel>();
    }
    public string CarModelName {get;set;}
    public IList<CarModel> CarSubModels {get;private set;}
    public void AddSubModel(CarModel car){
        if (car == null)
            throw new ArgumentNullException("car");
        if (!CarSubModels.Contains(car))
            CarSubModels.Add(car);
    }
    public void RemoveSubModel(CarModel car){
        if (car == null)
            throw new ArgumentNullException("car");
        if (CarSubModels.Contains(car))
            CarSubModels.Remove(car);
    }
    public void Print(int level=0){
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < level; i++)
            sb.Append(' ');
        sb.Append(CarModelName);
        string line = sb.ToString();
        Console.Writeline(line);
        foreach (CarModel car in CarSubModels)
            car.Print(level+1);            
    }
}