Dictionary или простой массив? - C#
Формулировка задачи:
Есть массив данных в несколько десятков тысяч единиц с уникальными идентификаторами, в каждой единице много информации - несколько строк, пара небольших коллекций, с десяток числовых и булевых параметров. Также известно, что в процессе работы могут потребоваться различные инстансы этих единиц с различными параметрами, так сказать, реализация системы классов в программе. Выглядеть это будет примерно так:
То есть, это будет как бы библиотека данных (загружаемая из файла, базы данных - не важно), которая напрямую в программе не используется. Программа использует только переменные типа EntryData и IEntries.
Вопрос вот в чём: Как организовать это производительнее, если известно, что идентификаторы начинаются с нуля и шаг - единица, а также известно, что каждая единица может быть запрошена как по числовому, так и по строковому идентификатору? Рациональны ли предложенные мной варианты? Если да, то который из них лучше?
// описание структуры, отвечающей за неизменяемые данные единицы public class Entry { public readonly int ID; public readonly string StringID; string _name; string _description; string _shortDescription; public string GetName(){/*...*/} public string GetDescription(){/*...*/} public string GetShortDescription(){/*...*/} // прочие данные и методы, не зависящие от конкретного экземпляра } public struct /* class? */ EntryData { public int ID; public int Data1, Data2, Data3 /* ... */; public List<int> List1, List2; public bool Bool1, Bool2; //пример функции доступа к списку public string GetName(IEntries entrylist) => entrylist[this.ID].GetName(); } public interface IEntries { Entry this[int id](); Entry this[string id](); void Load(); // в дальнейших реализациях не показан, но по факту // отвечает за загрузку данных, примем, что загрузка абсолютно корректна. } public class EntryList1 : IEntries { Entry[] _arrEntries = new Entry[30000]; Dictionary<string, int> _idDict; //словарь используется для доступа к массиву Entry this[int id] {get => _arrEntries[id];} Entry this[string id] {get => _arrEntries[_idDict[id]];} } public class EntryList2 : IEntries { Dictionary<string, Entry> _strEntries; Dictionary<int, Entry> _intEntries; //при заполении два словаря заполняются одновременно Entry this[int id] {get => _intEntries[id];} Entry this[string id] {get => _strEntries[id];} } public class EntryList3 : IEntries { Entry[] _arrEntries = new Entry[30000]; Entry this[int id] {get => _arrEntries[id];} Entry this[string id] { get { //осуществляется поиск на соответствие строки в массиве, через расширения или LINQ - неважно. var res = _arrEntries.Where(en => en.StringID == id); return res.Count > 0 ? res[0] : _arrEntries[0]; } } }
Решение задачи: «Dictionary или простой массив?»
textual
Листинг программы
public class EntryList1 : IEntries { Entry[] _arrEntries = new Entry[30000]; Dictionary<string, Entry> _idDict; //словарь используется для доступа к массиву Entry this[int id] {get => _arrEntries[id];} Entry this[string id] {get => _idDict[id];} }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д