StringDictionary как общий статический список? - PullRequest
2 голосов
/ 16 апреля 2009

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

До сих пор я придумал это решение, открытый статический класс с открытым свойством:

public static class Common
{
    public static StringDictionary Domains
    {
        get
        {
            StringDictionary list = new StringDictionary();

            list.Add("212", "Location A");
            list.Add("555", "Location B");
            list.Add("747", "Location C");
            list.Add("000", "Location D");

            return list;
        }
    }
}

, который я использую таким образом (я использую его для замены содержимого ячейки в виде сетки):

if (Common.Domains.ContainsKey(e.Row.Cells[5].Text))
{
    e.Row.Cells[5].Text = Common.Domains[e.Row.Cells[5].Text];
}
else
{
    e.Row.Cells[5].Text = "n/a";
}

Но я не знаю, является ли это эффективным решением и / или есть ли другие (лучшие) способы сделать это ... Может кто-нибудь дать подсказку?

Заранее спасибо, Андреа.

Ответы [ 4 ]

3 голосов
/ 16 апреля 2009

Вы, вероятно, не хотите пересоздавать список каждый раз, когда осуществляется доступ к свойству. Переместите конструкцию в статический конструктор:

public static class Common
{
    private static StringDictionary _domains;
    static Common()
    {
        _domains = new StringDictionary();
        _domains.Add("212", "Location A");
        _domains.Add("555", "Location B");
        _domains.Add("747", "Location C");
        _domains.Add("000", "Location D");
    }
    public static StringDictionary Domains
    {
        get
        {
            return _domains;
        }
    }
}

И вы должны знать, что возвращаемый словарь не только для чтения. Таким образом, клиент этого класса может изменить коллекцию (например, добавить / удалить некоторые записи).

0 голосов
/ 16 апреля 2009

@ Джефф Фриц прав в своем ответе, но я просто хотел добавить немного больше о совместном доступе к этому полю между несколькими потоками. StringDictionary является только поточно-ориентированным для операций чтения, но не для операций записи, поэтому вы должны быть осторожны, чтобы не изменять эту коллекцию без надлежащей блокировки, а также заблокировать коллекцию при итерации над ним.

Для повторения:

lock(Common.Domains) {
    foreach(var domain in Common.Domains) {
    }
}

Чтобы добавить домен за пределами статический конструктор:

lock(Common.Domains) {
    Common.Domains.Add("111", "Location 3");
}

В общем, я буду очень осторожен, когда делюсь коллекцией, не предназначенной только для чтения, через статическое поле, чтобы поле не изменялось. Вы можете вместо этого сделать StringDictionary a ReadOnlyCollection и пометить поле «только для чтения»:

public static readonly ReadOnlyCollection<Pair<string, string>> domains

Вы не получите O (1) поисков, но я предполагаю, что эта коллекция будет очень маленькой, так что в любом случае это не будет иметь значения.

0 голосов
/ 16 апреля 2009

Попробуйте вместо этого использовать шаблон Singleton:

http://en.wikipedia.org/wiki/Singleton_pattern

Это не обязательно, так как у каждой программы есть свои особые потребности, я только рекомендую вам прочитать об этом шаблоне и переосмыслить свой дизайн снова.

Если ваша программа многопоточная, вы можете проверить, является ли StringDictionary поточно-ориентированным, если он не поточнобезопасен (а ваша программа многопоточна), вам следует добавить некоторый механизм синхронизации в ваш класс.

0 голосов
/ 16 апреля 2009

Ваш словарь будет перезагружаться при каждом входе в систему Domains

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

...