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]);