如何存储设计时数据列表

本文关键字:数据 列表 何存储 存储 | 更新日期: 2023-09-27 18:05:11

我的数据中有以下结构:

Category0  
 -SubCategory0  
 -SubCategory1  
 -SubCategoryN  
Category1  
-SubCategory1_0  
-SubCategory1_1  
-SubCategory1_N  

一个类别将有一个NAME,一个Description和一个唯一的整数ID

Category = Ford Description = "USA Car" Id = 12345678  
-SubCategory: Name = Mondeo  Description = "Some text" Id = 12324       
-SubCategory: Name = Fiesta  Description = "Some text" Id = 9999   
-SubCategory: Name = Orion  Description = "Some text" Id = 123456   
-SubCategory: Name = Focus  Description = "Some text"Id = 8799  

列表在设计时是已知的,我需要绑定到listview。我想将Description绑定为listview每行上的Display Text,并将值(具有Name和Id的对象或枚举)绑定为相应的valuemember。

存储这些信息的最佳方法是什么?我应该创建大量枚举吗?或者我应该在设计器模式下使用分隔字符串(如"Ford:Mondeo:Some Text: 12324")直接绑定到listview,然后根据需要进行解析和提取。也许这将是更好的数据存储强类型枚举自定义属性的id/描述值,例如绑定到一个字典,其中字符串是一个描述和CarType是一个类的属性:Make(Ford):enum, Model(Modeo):enum和id (12324):int?

如何存储设计时数据列表

通常你会用两个类来建模:

public class Model
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}
public class Manufacturer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public List<Model> Models { get; set; }
}

如果您关心比较中的性能,并且您确切地知道所有制造商和型号名称,则应该考虑将名称更改为枚举。此外,如果您将按名称访问这些项,则应该考虑将它们保存在字典中,并以名称作为键。

这听起来像是XML的完美用途。您可以添加/删除类别,更改名称&描述等。解析成一个简单的类结构…

public class ParentCategory : Category
{     
    public List<Category> SubCategories { get; set; }
}
public class Category 
{     
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; } 
}

然后你只需将这些类绑定到你的视图。

仅仅因为它在设计时是已知的,并不是一个足够好的理由去创建大量的重复,冗余的代码。它使您的程序更加难以维护。是的,寻找不熟悉XML(或任何数据文件)的人更简单,但是如果发生了变化——例如,您需要向类别添加另一个属性——您需要去更改每个类/enum。又乱又乏味。

只是为了澄清,当我说XML只是我喜欢的格式。您还可以将数据存储为文本、CSV或任何您喜欢的格式。我更喜欢XML,因为它更容易使用。

edit2: 我明白你的担忧(if(carListView.SelectedValue == "Mondeo"))。如果不知道(或者想知道)你的整个系统或者你想做什么,我更喜欢用一种更通用的、以对象为中心的方式工作。

所以每种类型的汽车都需要一个if语句?为什么不让汽车自己工作呢?

public class ParentCategory : Category
{     
    public List<Category> SubCategories { get; set; }
    public void DoThings()
    { 
        // look at SubCategories, print something, etc
    }
}
// and then get the item to do things!
((ParentCategory)carListView.SelectedValue).DoThings();

这样就不会循环遍历整个列表。同样,尽量减少行数