Есть ли в C # .NET причина отсутствия конструктора копирования для StringDictionary? - PullRequest
2 голосов
/ 15 июля 2009

Я прошу прощения, если это глупый вопрос, но выслушайте меня:

Dictionary<string, string> genericDict = new Dictionary<string, string>;
genericDict.Add("blah", "bloop");
// Use the copy constructor to create a copy of this dictionary
return new Dictionary<string, string>(genericDict);

В приведенном выше примере кода я могу создать копию универсального словаря.

Теперь предположим, что я использую System.Collections.Specialized.StringDictionary, потому что я не чувствую необходимости печатать "строковые" типы везде. StringDictionary не имеет конструктора копирования! На самом деле, он имеет только конструктор по умолчанию.

Конечно, я могу перебирать StringDictionary и добавлять каждую пару ключ / значение вручную, но я не хочу: -P

Почему нет конструктора копирования? Я что-то здесь упускаю?

Ответы [ 4 ]

9 голосов
/ 15 июля 2009

Тип StringDictionary довольно устарел. Я думаю, что Dictionary<String,String> это то, что вы хотите использовать здесь.

Тип Dictionary<TKey,TValue> реализует некоторые строго типизированные интерфейсы (ICollection<KeyValuePair<TKey, TValue>> и IEnumerable<KeyValuePair<TKey, TValue>>), что делает его более полезным, чем тип StringDictionary.

Хотя тип StringDictionary строго набран , я бы не советовал использовать его только ради лени.

5 голосов
/ 15 июля 2009

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

public static StringDictionary NewCopy(this StringDictionary olddict)
{
    var newdict = new StringDictionary();
    foreach (string key in olddict.Keys)
    {
        newdict.Add(key, olddict[key]);
    }
    return newdict;
}

Тогда вы можете сделать это:

StringDictionary newdict = olddict.NewCopy();
2 голосов
/ 15 июля 2009

Я согласен с консенсусом - вам лучше использовать Dictionary<string, string>. Но если вам не нравится вводить универсальные типы все время, вы можете создать свой собственный подкласс:

public class StringDict : Dictionary<string, string>
{
  // duplicate all Dictionary's constructors here, calling the base constructor for each. 
}

Et Voila! Всякий раз, когда вы хотите использовать строку Dictionary, вместо этого вы используете StringDict.

1 голос
/ 15 июля 2009

Если вы не хотите вводить «строковые» типы где-либо, но в остальном довольны Dictionary<string,string>, создайте новый класс, который подклассов Dictionary<string,string>, и просто не переопределяйте никакие методы. Вы даже можете назвать это StringDictionary, если оно находится в другом пространстве имен.

...