Dictionary или простой массив? - C#

Узнай цену своей работы

Формулировка задачи:

Есть массив данных в несколько десятков тысяч единиц с уникальными идентификаторами, в каждой единице много информации - несколько строк, пара небольших коллекций, с десяток числовых и булевых параметров. Также известно, что в процессе работы могут потребоваться различные инстансы этих единиц с различными параметрами, так сказать, реализация системы классов в программе. Выглядеть это будет примерно так:
// описание структуры, отвечающей за неизменяемые данные единицы
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];
        }
    }
}
То есть, это будет как бы библиотека данных (загружаемая из файла, базы данных - не важно), которая напрямую в программе не используется. Программа использует только переменные типа EntryData и IEntries. Вопрос вот в чём: Как организовать это производительнее, если известно, что идентификаторы начинаются с нуля и шаг - единица, а также известно, что каждая единица может быть запрошена как по числовому, так и по строковому идентификатору? Рациональны ли предложенные мной варианты? Если да, то который из них лучше?

Решение задачи: «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];}
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы