objetos new lista example elementos ejemplos diccionario agregar c# .net dictionary namevaluecollection

new - lista de objetos c#



Copie los valores clave de NameValueCollection al diccionario genérico (7)

Método de extensión más linq:

public static Dictionary<string, string> ToDictionary(this NameValueCollection nvc) { return nvc.AllKeys.ToDictionary(k => k, k => nvc[k]); } //example var dictionary = nvc.ToDictionary();

Intentando copiar los valores de un objeto NameValueCollection existente en un Diccionario. Tengo el siguiente código a continuación para hacer eso, pero parece que Agregar no acepta que mis claves y valores sean como cadenas.

IDictionary<TKey, TValue> dict = new Dictionary<TKey, TValue>(); public void copyFromNameValueCollection (NameValueCollection a) { foreach (var k in a.AllKeys) { dict.Add(k, a[k]); } }

Nota: NameValueCollection contiene claves y valores de cadena, por lo que simplemente quiero proporcionar aquí un método que permita copiarlos en un diccionario genérico .


No debes olvidarte de EqualityComparer. Pero no es una propiedad pública. Entonces, deberías usar la reflexión para conseguirlo.

public static IEqualityComparer GetEqualityComparer(this NameObjectCollectionBase nameObjectCollection) { PropertyInfo propertyInfo = typeof(NameObjectCollectionBase).GetProperty("Comparer", BindingFlags.Instance | BindingFlags.NonPublic); return (IEqualityComparer)propertyInfo.GetValue(nameObjectCollection); } public static IEqualityComparer<string> GetEqualityComparer(this NameValueCollection nameValueCollection) { return (IEqualityComparer<string>)((NameObjectCollectionBase)nameValueCollection).GetEqualityComparer(); } public static Dictionary<string, string> ToDictionary(this NameValueCollection nameValueCollection) { Dictionary<string, string> dictionary = nameValueCollection.AllKeys.ToDictionary(x => x, x => nameValueCollection[x], nameValueCollection.GetEqualityComparer()); return dictionary; }


No tiene sentido usar los genéricos aquí ya que no puede asignar string a algún tipo genérico arbitrario:

IDictionary<string, string> dict = new Dictionary<string, string>(); public void copyFrom(NameValueCollection a) { foreach (var k in a.AllKeys) { dict.Add(k, a[k]); } }

aunque probablemente deberías crear un método para crear un nuevo diccionario en su lugar:

public static IDictionary<string, string> ToDictionary(this NameValueCollection col) { IDictionary<string, string> dict = new Dictionary<string, string>(); foreach (var k in col.AllKeys) { dict.Add(k, col[k]); } return dict; }

que puedes usar como:

NameValueCollection nvc = // var dictionary = nvc.ToDictionary();

Si desea una forma general de convertir las cadenas en la colección en los tipos de clave / valor requeridos, puede usar convertidores de tipo:

public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this NameValueCollection col) { var dict = new Dictionary<TKey, TValue>(); var keyConverter = TypeDescriptor.GetConverter(typeof(TKey)); var valueConverter = TypeDescriptor.GetConverter(typeof(TValue)); foreach(string name in col) { TKey key = (TKey)keyConverter.ConvertFromString(name); TValue value = (TValue)valueConverter.ConvertFromString(col[name]); dict.Add(key, value); } return dict; }


Si sabe que su diccionario siempre contendrá cadenas, especifíquelo para que contenga cadenas en lugar de hacer que su clase sea genérica:

IDictionary<string, string> dict = new Dictionary<string, string>();

Con esto, las cosas "simplemente funcionarán" como están escritas (sin la especificación genérica del método).

Si necesita que esto sea una clase genérica y que contenga datos genéricos, necesita alguna forma de convertir de string a TKey y string a TValue . Puede proporcionar delegados a su método de copia para hacer esto:

public void CopyFrom(NameValueCollection a, Func<string, TKey> keyConvert, Func<string, TValue> valueConvert) { foreach(var k in a.AllKeys) { dict.Add(keyConvert(k), valueConvert(a[k])); } }

Entonces necesitaría pasar un delegado que realizaría la conversión de cadena a TValue y cadena a TKey .


Utilice LINQ:

public static IDictionary<string, string> ToDictionary(this NameValueCollection collection) { return collection.Cast<string>().ToDictionary(k => k, v => collection[v]); }

Uso:

IDictionary<string, string> dic = nv.ToDictionary();


Versión super-corta

var dataNvc = HttpUtility.ParseQueryString(data); var dataCollection = dataNvc.AllKeys.ToDictionary(o => o, o => dataNvc[o]);


parameters.AllKeys.ToDictionary(t => t, t => parameters[t]);