Как вы уже указали, любое из предложенных решений выполнит задачу, как вы ее описали.Это означает, что единственный рациональный способ выбрать конкретный метод - это определить ваши требования:
- Должен ли ваш код поддерживать несколько потоков, одновременно обращающихся к источнику данных?Если это так, то использование
ConcurrentDictionary
, как предположил Яхья, имеет смысл.В противном случае, нет причин брать на себя дополнительные издержки и усложнять использование параллельной структуры данных. - Вы работаете в среде, где сбор мусора является проблемой (например, игра XNA)?В таком случае любое предложение, касающееся объединения строк, будет проблематичным.
- Вам нужен O (1) доступ к произвольным индексам источника данных?Если так, ваш третий подход имеет смысл.С другой стороны, если все, что вы делаете - это перебираете коллекцию, то нет причин брать на себя дополнительные накладные расходы при вставке в хеш-таблицу;вместо этого используйте
List<KeyValuePair<String, String>>
. - С другой стороны, вы можете не работать в среде, где необходима описанная выше оптимизация;для вас может быть важна возможность четкого определения пар ключ / значение программно.В этом случае лучше использовать
Dictionary
.
Вы не можете принять обоснованное решение относительно , как реализовать функцию без полного определения , чтофункция должна сделать , и, поскольку вы этого не сделали, любой ответ, приведенный здесь, обязательно будет неполным.
Учитывая ваши разъяснения, я лично предложил бы следующее:
Старайтесь не делать ваш метод Config () поточно-безопасным по умолчанию в соответствии с рекомендациями MSDN:
По умолчанию библиотеки классов не должны быть поточно-безопасными,Добавление блокировок для создания поточно-ориентированного кода снижает производительность, повышает конфликтность блокировок и создает возможность возникновения ошибок взаимоблокировок.
Если безопасность потока становится важной позже, сделайте этоответственность вызывающего абонента.
Учитывая, что у вас нет особых требований к производительности, придерживайтесь словаря, чтобы пары ключей / значений можно было легко определять и читать.
Для простоты и во избежание генерации большого количества ненужных строк, выполняющих конкатенации, просто передайте словарь напрямую и выполните итерации по нему.
Рассмотрите следующий пример:
var configData = new Dictionary<String, String>
configData["key1"] = "value1";
configData["key2"] = "value2";
myLibraryObject.Config(configData);
И реализация Config:
public void Config(Dictionary<String, String> values)
{
foreach(var kvp in values)
{
var configString = String.Format("{0}={1}", kvp.Key, kvp.Value);
// do whatever
}
}