Как преобразовать NameValueCollection в Hashtable

У меня есть объект NameValueCollection, и мне нужно преобразовать его в объект Hashtable, желательно одной строкой кода. Как я могу этого добиться?


person MarioVW    schedule 08.04.2011    source источник


Ответы (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
comment
проблема в том, что я использую API, который ожидает Hashtable, поэтому использование Dictionary не вариант... - person MarioVW; 09.04.2011
comment
здесь есть загвоздка. NameValueCollection допускает дублирование ключей. В этом случае все значения вставляются для одного и того же ключа в HashTable. для каждого уникального ключа существует только одна запись. например если у вас есть красный ключ, указанный дважды против значений rouge и verde, оба значения будут перечислены против хэш-ключа red как один ключ. - person Priyank; 09.04.2011
comment
@Приянк хорошая мысль! Необходимо выполнить некоторую постобработку, чтобы применить какую-либо специальную обработку в зависимости от потребностей 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