Estoy usando una API que devuelve una colección de clave-valor como Dictionary<string, string>
. Necesito convertir eso a un Dictionary<string, object>
. Tengo la sensación de que debería haber una manera de hacer esta conversión/mapeo sin hacer un ciclo "manual" a través de cada par de clave-valor, pero Google o la referencia del objeto C# no dieron inmediatamente una solución.¿Cuál es la forma más sencilla de convertir un Diccionario <cadena, cadena> a un Diccionario <cadena, objeto>?
10
A
Respuesta
22
Pruebe lo siguiente
var newMap = oldMap.ToDictionary(pair => pair.Key, pair=>(object)pair.Value);
0
Puede utilizar este método de extensión:
public static class ObjectExtensions
{
public static object GetPropertyValue(this object obj, string property)
{
return TypeDescriptor.GetProperties(obj)[property].GetValue(obj);
}
public static IDictionary<string, object> ToDictionary(this object obj)
{
IDictionary<string, object> result = new Dictionary<string, object>();
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj);
foreach (PropertyDescriptor property in properties)
{
result.Add(property.Name, property.GetValue(obj));
}
return result;
}
}
Usted usarlo como:
new Dictionary<string, string>().ToDictionary();
3
sin loop, asigna un Dictionary{T, U}
a Dictionary{T, object}
en tiempo constante:
class DictionaryWrapper<T, U> : IDictionary<T, object>
{
readonly Dictionary<T, U> inner;
public DictionaryWrapper(Dictionary<T, U> wrapped)
{
this.inner = wrapped;
}
#region IDictionary<T,object> Members
public void Add(T key, object value) { inner.Add(key, (U)value); }
public bool ContainsKey(T key) { return inner.ContainsKey(key); }
public ICollection<T> Keys { get { return inner.Keys; } }
public bool Remove(T key) { return inner.Remove(key); }
public bool TryGetValue(T key, out object value)
{
U temp;
bool res = inner.TryGetValue(key, out temp);
value = temp;
return res;
}
public ICollection<object> Values { get { return inner.Values.Select(x => (object)x).ToArray(); } }
public object this[T key]
{
get { return inner[key]; }
set { inner[key] = (U)value; }
}
#endregion
#region ICollection<KeyValuePair<T,object>> Members
public void Add(KeyValuePair<T, object> item) { inner.Add(item.Key, (U)item.Value); }
public void Clear() { inner.Clear(); }
public bool Contains(KeyValuePair<T, object> item) { return inner.Contains(new KeyValuePair<T, U>(item.Key, (U)item.Value)); }
public void CopyTo(KeyValuePair<T, object>[] array, int arrayIndex) { throw new NotImplementedException(); }
public int Count { get { return inner.Count; } }
public bool IsReadOnly { get { return false; } }
public bool Remove(KeyValuePair<T, object> item) { return inner.Remove(item.Key); }
#endregion
#region IEnumerable<KeyValuePair<T,object>> Members
public IEnumerator<KeyValuePair<T, object>> GetEnumerator()
{
foreach (var item in inner)
{
yield return new KeyValuePair<T, object>(item.Key, item.Value);
}
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
foreach (var item in inner)
{
yield return new KeyValuePair<T, object>(item.Key, item.Value);
}
}
#endregion
}
Con algunos parametros más generales, se puede generalizar esta clase adicional para que se asigna un Dictionary{A, B}
a un Dictionary{C, D}
.
Cuestiones relacionadas
- 1. cómo convertir Diccionario <dinámico, dinámico> a Diccionario <cadena, cadena> usando Colllection.ToDictionary()
- 2. Una manera sencilla de convertir una cadena en un diccionario
- 3. Forma fácil de convertir un diccionario <cadena, cadena> a xml y viceversa
- 4. Convertir diccionario <cadena, objeto> ¿A objeto anónimo?
- 5. ¿Qué es más rápido/más eficiente: Diccionario <cadena, objeto> o Diccionario <enum,object>?
- 6. Forma fácil de poblar un diccionario <cadena, Lista <string>>
- 7. Obtener la primera clave del Diccionario <cadena, cadena>
- 8. Convierta una cadena delimitada a un diccionario <cadena, cadena> en C#
- 9. Convertir diccionario a List <KeyValuePair>
- 10. Comparando 2 Diccionario <cadena, cadena> Instancias
- 11. .NET: forma eficiente de producir una cadena a partir de un diccionario <K,V>?
- 12. Creación de un diccionario de una cadena
- 13. Controlador MongoDB C# - Cómo insertar un lote utilizando una lista de diccionario <cadena, cadena>
- 14. Consulta de LINQ para devolver un diccionario <cadena, cadena>
- 15. binario a cadena, mejor que un diccionario?
- 16. Convertir encabezados http (cadena) a un diccionario python
- 17. ¿La mejor manera de convertir el diccionario <cadena, cadena> en representación de cadena agregada única?
- 18. Diccionario de la tienda <cadena, cadena> en la configuración de la aplicación
- 19. ¿Convertir Diccionario <String,Int> al Diccionario <String, SomeEnum> using LINQ?
- 20. Cómo convertir en el diccionario de cadena
- 21. Convertir <String> a cadena delimitada
- 22. Convertir la lista <MyObject> al Diccionario <obj.string, Lista <obj.ID>>
- 23. ¿Existe alguna forma más elegante de agregar un elemento a un Diccionario <> de forma segura?
- 24. Diccionario más eficiente <K,V> .ToString() con formato?
- 25. ¿Está almacenando el diccionario <cadena, cadena> en el estado de la vista ASP.NET?
- 26. Cómo convertir Diccionario <> a Hashtable en C#?
- 27. ¿Cómo hacer referencia a los elementos en el diccionario <cadena, cadena> por índice entero?
- 28. ¿Cuál es la forma más sencilla de agregar uno a una cadena binaria en Perl?
- 29. Subcadenas a juego de un diccionario a otra cadena: ¿sugerencias?
- 30. ¿cuál es la diferencia entre la lista <> y el diccionario <> en C#
+1, sin embargo, vale la pena señalar que esto no es más "ágil" que la forma en que OP desea evitar, simplemente lo oculta detrás de una sintaxis bastante brillante. –
@Rex, cierto, pero evita el bucle manual según lo solicitado por el OP. – JaredPar
"Lean" se puede estirar para significar cosas diferentes. En mi caso, solo estaba buscando una solución rápida para salvar el día. Gracias por esta respuesta. –