Есть ли в C # .NET причина отсутствия конструктора копирования для StringDictionary?

2

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

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

Почему нет конструктора копирования? Я что-то пропустил?

Теги:
dictionary
collections
stringdictionary

4 ответа

9
Лучший ответ

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

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

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

  • 0
    Да, но не для универсального словаря <typeKey, typeValue>, а не для специализированного StringDictionary? Мне просто интересно, почему эта очень удобная перегрузка не была реализована для специализированного StringDictionary.
  • 2
    Я думаю, он говорит, что универсальный тип имеет конструктор такого типа, а старый специализированный словарь - нет.
Показать ещё 2 комментария
5

Если вы действительно хотите использовать 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

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

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

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

  • 1
    Я думаю, что StrigDict предлагает более привлекательный набор функций.
  • 0
    Эх ты! Опечатка исправлена.
Показать ещё 1 комментарий
1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню