Как отметил arootbeer в своем ответе , следующий код не создает несколько экземпляров строки "ABC"; скорее, он интернирует один экземпляр и назначает ссылку на этот экземпляр каждому KeyValuePair<int, string>
в dictionary
:
var dictionary = new Dictionary<int, string>();
dictionary[0] = "ABC";
dictionary[1] = "ABC";
dictionary[2] = "ABC";
// etc.
ОК, поэтому в случае строковых литералов вы используете только один экземпляр string
на диапазон ключей. Существует ли сценарий, в котором этого не произойдет, то есть когда вы будете использовать отдельный экземпляр string
для каждого ключа в пределах диапазона (это то, о чем вы, как я полагаю, беспокоитесь, когда говорите об этом " перерасход памяти ")?
Честно говоря, я так не думаю. Есть сценарии, когда несколько эквивалентных строковых экземпляров могут быть созданы без использования интернирования, да. Но я не могу представить, что эти сценарии повлияют на то, что вы пытаетесь сделать здесь.
Я рассуждаю так: вы хотите присвоить определенные значения различным диапазонам клавиш, верно? Таким образом, каждый раз, когда вы определяете подобие пары ключ-диапазон-значение, у вас есть одиночное значение и несколько клавиш . single - это то, что заставляет меня усомниться в том, что у вас когда-нибудь будет несколько экземпляров одной и той же строки, если только она не определена как значение для более чем одного диапазона.
Для иллюстрации: да, следующий код создаст две одинаковые строки:
string x = "ABC";
Console.Write("Type 'ABC' and press Enter: ");
string y = Console.ReadLine();
Console.WriteLine(Equals(x, y));
Console.WriteLine(ReferenceEquals(x, y));
Приведенная выше программа при условии, что пользователь следует инструкциям и набирает «ABC», выводит True
, затем False
. Так что вы можете подумать: «Ах, поэтому, когда строка предоставляется только во время выполнения, она не интернируется! Так что это может быть то, где мои значения могут быть продублированы!»
Но ... еще раз: Я так не думаю . Все это возвращается к тому факту, что вы будете назначать single диапазону клавиш. Итак, скажем, ваши значения получены из пользовательского ввода; тогда ваш код будет выглядеть примерно так:
var dictionary = new Dictionary<int, string>();
int start, count;
GetRange(out start, out count);
string value = GetValue();
foreach (int key in Enumerable.Range(start, count))
{
// Look, you're using the same string instance to assign
// to each key... how could it be otherwise?
dictionary[key] = value;
}
Теперь, если вы на самом деле больше думаете о том, что Л.Бушкин упоминает в своем ответе - что у вас потенциально могут быть огромные диапазоны, что делает нецелесообразным определение KeyValuePair<int, string>
для каждого ключа в пределах этот диапазон (например, если у вас есть диапазон 1-1000000) - тогда я бы согласился, что вам лучше иметь какую-то структуру данных, которая основывается на поиске бинарного поиска. Если это больше ваш сценарий, так и скажите, и я буду рад предложить больше идей на этот счет. (Или вы можете просто посмотреть на ссылку, которую уже опубликовал Л.Бушкин.)