Sto utilizzando un'API che restituisce una raccolta di valori-chiave come Dictionary<string, string>
. Devo convertirlo in un Dictionary<string, object>
. Ho la sensazione che ci dovrebbe essere un modo per fare questa conversione/mappatura senza "manualmente" il ciclo attraverso ogni coppia chiave-valore, ma Googling o il riferimento all'oggetto C# non ha prodotto immediatamente una soluzione.Qual è il modo più semplice per convertire un dizionario <stringa, stringa> in un dizionario <stringa, oggetto>?
10
A
risposta
22
Provate il seguente
var newMap = oldMap.ToDictionary(pair => pair.Key, pair=>(object)pair.Value);
0
È possibile utilizzare questo metodo di estensione:
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;
}
}
Si usa piace:
new Dictionary<string, string>().ToDictionary();
3
No looping, mappa un Dictionary{T, U}
a Dictionary{T, object}
in tempo costante:
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 pochi params più generici, si può generalizzare questa classe ulteriormente, in modo che mappa un Dictionary{A, B}
ad un Dictionary{C, D}
.
Problemi correlati
- 1. Un modo semplice per convertire un dizionario <stringa, stringa> in xml e viceversa
- 2. modo semplice per convertire una stringa in un dizionario
- 3. come convertire Dizionario <dinamico, dinamico> in Dizionario <stringa, stringa> utilizzando Colllection.ToDictionary()
- 4. Convertire una stringa delimitata in un dizionario <stringa, stringa> in C#
- 5. Il modo migliore per convertire il dizionario <stringa, stringa> in una rappresentazione di stringa aggregata singola?
- 6. Quale è più veloce/più efficiente: Dizionario <stringa, oggetto> o Dizionario <enum,object>?
- 7. Converti JObject nel dizionario <stringa, oggetto>. È possibile?
- 8. Convertire il dizionario <String,Int> nel dizionario <String, SomeEnum> utilizzando LINQ?
- 9. Come convertire dizionario nella stringa
- 10. Il modo più semplice per sostituire una stringa utilizzando un dizionario di sostituzioni?
- 11. Come aggiungere un dizionario <stringa, stringa> a un JObject JSON.Net esistente?
- 12. come iterare un dizionario <stringa, stringa> in ordine inverso (dall'ultimo al primo) in C#?
- 13. Il modo più semplice per convertire un URL in un collegamento ipertestuale in una stringa C#?
- 14. L'elenco a discesa per Dizionario <stringa, stringa> non funziona con il valore selezionato
- 15. Come convertire il dizionario <> in Hashtable in C#?
- 16. Qual è il modo più semplice per convertire una stringa xhtml in PDF usando Flying Saucer?
- 17. Convertire una stringa in un java.util.Stream <Character>
- 18. Il modo migliore per convertire la stringa di query nel dizionario in C#
- 19. Qual è il modo più veloce per cercare un elenco <T> su più proprietà?
- 20. Ottieni la chiave dal valore - Dizionario <stringa, Lista <string>>
- 21. Converti dizionario in elenco <KeyValuePair>
- 22. Qual è il modo migliore per convertire una stringa separata da caratteri di ritorno in un elenco <string>?
- 23. Qual è il modo più semplice per ordinare un EF4 EntityCollection <T>?
- 24. LINQ query per restituire un dizionario <string, string>
- 25. .NET: metodo efficiente per produrre una stringa da un dizionario <K,V>?
- 26. Dizionario più efficiente <K,V> .ToString() con formattazione?
- 27. Qual è il modo migliore per convertire enum in stringa?
- 28. Stringa al dizionario in Python
- 29. Qual è il modo migliore per impostare tutti i valori in un dizionario C# <string,bool>?
- 30. Il modo migliore per filtrare un dizionario in Python
+1, ma vale la pena notare che questo non è più "snello" del modo in cui l'OP vuole evitare, ma lo nasconde dietro una sintassi piuttosto brillante. –
@Rex, true, ma evita il loop manuale come richiesto dall'OP. – JaredPar
"Lean" può essere allungato per significare cose diverse. Nel mio caso stavo solo cercando una soluzione rapida per salvare la giornata. Grazie per questa risposta. –