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