Оболочка для вложенного словаря - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть реализация вложенного словаря, подобная этой:

Dictionary<class1, Dictionary<int, class2>>

Теперь я использую это во многих местах в моем проекте, но мне некрасиво писать такое длинное имя каждый раз, например:

Dictionary<class1, Dictionary<int, class2>> obj1=new Dictionary<class1, Dictionary<int, class2>>();
Dictionary<class1, Dictionary<int, class2>> obj2=new Dictionary<class1, Dictionary<int, class2>>();
Dictionary<class1, Dictionary<int, class2>> obj3=new Dictionary<class1, Dictionary<int, class2>>();

Могу ли я сделать обертку для этого словаря, чтобы я мог просто написать ее так, чтобы сделать ее более читабельной:

MyWrapper obj1=new MyWrapper();
MyWrapper obj2=new MyWrapper();
MyWrapper obj3=new MyWrapper();

Ответы [ 4 ]

3 голосов
/ 11 ноября 2010

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

using MyWrapper = 
    System.Collections.Generic.Dictionary<Namespace.class1,
    System.Collections.Generic.Dictionary<int, Namespace.class2>>;

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

Оба следующих использования эквивалентны.

MyWrapper w1 = new MyWrapper();
MyWrapper w2 = new Dictionary<class1, Dictionary<int, class2>>();
2 голосов
/ 11 ноября 2010

Я написал оболочку один раз, давайте посмотрим, здесь это так.

Вы можете получить доступ к элементу двумя ключами, такими как dictionary["key1", "key2"].

1 голос
/ 11 ноября 2010

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

public class MyWrapper<T1, T2, T3>
{
    private IDictionary<T1, IDictionary<T2, T3>> dictionary;

    public MyWrapper()
    {
        dictionary = new Dictionary<T1, IDictionary<T2, T3>>();
    }

    public static void Main(string[] args)
    {
        var myWrapper = new MyWrapper<int, string, bool>();
    }
}
1 голос
/ 11 ноября 2010

Да, вы могли бы:

public class MyWrapper : Dictionary<class1, Dictionary<int, class2>>
{}

Конечно, вы можете добавить некоторые методы к этой оболочке, которые упростят поиск и вставки (и любые другие необходимые функции).

В качестве альтернативы, вы можете использовать ключевое слово var, чтобы уменьшить некоторые "шумы", без использования оболочки:

var obj1 = new Dictionary<class1, Dictionary<int, class2>>();

Или комбинация ...

var obj1 = new MyWrapper();
...