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

时间:2011-10-19 21:52:22

标签: c# asp.net

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

所以我可以这样打印出来:

     - Toyota
         Corolla      
         Camry  
         ...

     - Nissan
        Altima  
        Sentra  
        ...

所以,我认为我需要某种层次数据。我想到了制作班级制作和班级模型。 Make有一个模型列表。然后我有制作清单。但这看起来过于复杂。这种事情的最佳解决方案是什么?

4 个答案:

答案 0 :(得分:1)

这取决于你的意思,“商店”。在磁盘?在内存中的应用程序?

数据库有利于持久存储此类事物。如果这看起来有点过分,但您需要存储在磁盘上,则可以使用CSV或XML文件。如果您希望它内置到您的应用程序中,您可以以编程方式创建它,但最好嵌入资源并将其读入合适的结构(见下文)..

根据您在应用程序/程序中的操作,存储和表示此数据的方法有很多种,很多种。对象图(使用类,继承等),DataSet,树,......

答案 1 :(得分:0)

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

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

Make  ( MakeName,
        PRIMARY KEY MakeName )

Model ( MakeName,
        ModelName,
        FOREIGN KEY MakeName REFERENCES Make(MakeName),
        PRIMARY KEY (MakeName, ModelName) )

答案 2 :(得分:0)

真的取决于你的应用程序的含义和模型,如果它们只是字符串,那么你可以使用像dictionary<string,list<string>>这样的列表字典,字典的键将是make,值是列表模特

答案 3 :(得分:0)

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

}