Как сохранить список данных времени разработки

У меня есть следующая структура в моих данных:

Category0  
 -SubCategory0  
 -SubCategory1  
 -SubCategoryN  

Category1  
-SubCategory1_0  
-SubCategory1_1  
-SubCategory1_N  

Категория будет иметь НАЗВАНИЕ, описание и уникальный целочисленный идентификатор.

e.g.

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  

Список известен во время разработки, и мне нужно привязать его к списку. Я хотел бы связать описание как отображаемый текст в каждой строке списка и значения (объект или перечисление с именем и идентификатором) в качестве соответствующего члена значения.

Каков наилучший способ хранения этой информации? Должен ли я создавать большое количество перечислений? Или я должен напрямую привязываться к списку в режиме дизайнера, используя строки с разделителями, такие как «Ford: Mondeo: Some Text: 12324», а затем анализировать и извлекать по мере необходимости. Возможно, было бы лучше хранить данные в строго типизированных перечислениях с настраиваемыми атрибутами для значений идентификатора/описания, например, привязать к словарю, где строка — это описание, а CarType — это класс со свойствами: Make(Ford):enum, Model(Modeo ): перечисление и идентификатор (12324): int?


person guazz    schedule 11.08.2011    source источник
comment
Как часто данные могут меняться? Нужно ли легко обновлять?   -  person Igby Largeman    schedule 12.08.2011
comment
Не очень часто. Изменение кода было бы в порядке, чтобы облегчить обновление. Меня беспокоит выполнение слабо типизированных сравнений в списке, например: if(carListView.SelectedValue == Mondeo)   -  person guazz    schedule 12.08.2011
comment
Очевидно, я бы предпочел if(carListView.SelectedValue == CarMode.Modeo)...   -  person guazz    schedule 12.08.2011
comment
Какие операции вам нужно сделать с данными? Ожидаете ли вы иметь сложную логику, основанную на определенных значениях (как в вашем примере if (SelectedValue == Mondeo))?   -  person svick    schedule 12.08.2011
comment
Пожалуйста, не добавляйте к заголовкам префикс C# — для этого мы используем теги в Stack Overflow.   -  person John Saunders    schedule 12.08.2011
comment
@guazz, сколько у вас будет категорий и подкатегорий?   -  person Kirk Broadhurst    schedule 12.08.2011


Ответы (2)


Обычно вы моделируете это с помощью двух классов:

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

Если вас беспокоит производительность при сравнении, и вы точно знаете все названия производителей и моделей, вам следует подумать об изменении имен в перечисления. Кроме того, если вы будете обращаться к этим элементам по имени, вам следует подумать о том, чтобы сохранить их в словаре с именем в качестве ключа.

person alf    schedule 11.08.2011
comment
Это станет довольно неопрятным с более чем 3 или 4 классами. - person Kirk Broadhurst; 12.08.2011

Это звучит как идеальное использование для 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 (или любым файлом данных) проще посмотреть, но если что-то изменится - например, вам нужно добавить еще одно свойство в категории - вам нужно будет пойти и изменить каждый отдельный класс/перечисление. Грязно и утомительно.

edit: просто чтобы уточнить, когда я говорю 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();

Таким образом, нет перебора целых списков. Опять же, уменьшите количество строк.

person Kirk Broadhurst    schedule 12.08.2011