У меня есть объект NameValueCollection
, и мне нужно преобразовать его в объект Hashtable
, желательно одной строкой кода. Как я могу этого добиться?
Как преобразовать NameValueCollection в Hashtable
Ответы (2)
Вместо этого вам следует рассмотреть возможность использования общего Dictionary
, так как он строго типизирован, тогда как Hashtable
— нет. Попробуй это:
NameValueCollection col = new NameValueCollection();
col.Add("red", "rouge");
col.Add("green", "verde");
col.Add("blue", "azul");
var dict = col.AllKeys
.ToDictionary(k => k, k => col[k]);
EDIT: Судя по вашему комментарию, чтобы получить HashTable, вы все равно можете использовать описанный выше подход и добавить еще одну строку. Вы всегда можете сделать это в одну строку, но 2 строки более читабельны.
Hashtable hashTable = new Hashtable(dict);
В качестве альтернативы подход до .NET 3.5 с использованием цикла может быть следующим:
Hashtable hashTable = new Hashtable();
foreach (string key in col)
{
hashTable.Add(key, col[key]);
}
person
Ahmad Mageed
schedule
08.04.2011
проблема в том, что я использую API, который ожидает
Hashtable
, поэтому использование Dictionary
не вариант...
- person MarioVW; 09.04.2011
здесь есть загвоздка. NameValueCollection допускает дублирование ключей. В этом случае все значения вставляются для одного и того же ключа в HashTable. для каждого уникального ключа существует только одна запись. например если у вас есть красный ключ, указанный дважды против значений rouge и verde, оба значения будут перечислены против хэш-ключа red как один ключ.
- person Priyank; 09.04.2011
@Приянк хорошая мысль! Необходимо выполнить некоторую постобработку, чтобы применить какую-либо специальную обработку в зависимости от потребностей OP.
- person Ahmad Mageed; 09.04.2011
Это занимает более одной строки, но это довольно просто
NameValueCollection nv = new NameValueCollection();
Hashtable hashTable = new Hashtable();
nv.Add("test", "test");
foreach (string key in nv.Keys)
{
hashTable.Add(key, nv[key]);
}
Он компилируется и выполняется, как и ожидалось.
person
Jeff LaFay
schedule
08.04.2011