Прошу прощения, если это глупый вопрос, но выслушайте меня:
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
Почему нет конструктора копирования? Я что-то пропустил?
Тип StringDictionary
довольно устарел. Я думаю, что Dictionary<String,String>
- это то, что вы хотите использовать здесь.
Тип Dictionary<TKey,TValue>
реализует некоторые сильно типизированные интерфейсы (ICollection<KeyValuePair<TKey, TValue>>
и IEnumerable<KeyValuePair<TKey, TValue>>
), что делает его более полезным, чем тип StringDictionary
.
В то время как тип StringDictionary
строго типизирован, я бы не советовал его использовать только для лени.
Если вы действительно хотите использовать 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();
Я согласен с консенсусом - вам лучше использовать Dictionary<string, string>
. Но если вам не нравится вводить общие типы все время, вы можете создать свой собственный подкласс:
public class StringDict : Dictionary<string, string>
{
// duplicate all Dictionary constructors here, calling the base constructor for each.
}
Эт Воила! Всякий раз, когда вы хотите использовать строку Dictionary
, вместо этого вы используете StringDict
.
Если вы не хотите вводить типы "string" в любом месте, но в противном случае довольны Dictionary<string,string>
, тогда создайте новый класс, который подклассы Dictionary<string,string>
и просто не переопределят какие-либо методы. Вы даже можете назвать его StringDictionary
, если он находится в другом пространстве имен.