Ho un IEnumerable<KeyValuePair<string,string>>
, dal quale vorrei, idealmente, un oggetto anonimo che ha le chiavi come nomi di proprietà e i valori come valori di proprietà.Converti KeyValuePair in tipo anonimo in una query LINQ
Ho provato varie espressioni di selezione (nessuna delle quali nemmeno compilata ...) e un approccio utilizzando ExpandoObject
(vedi sotto), ma senza successo. C'è un buon modo per farlo? Se possibile, vorrei evitare un'iterazione esplicita extra sulla raccolta (ad esempio, fare tutto con una dichiarazione LINQ di qualche tipo).
Questo è quello che ho provato finora. Spero che chiarisce, inoltre, quello che sto cercando di fare:
var kvps = getProps(); // returns IEnumerable<KeyValuePair<string,string>>
dynamic o = new ExpandoObject();
foreach (var kvp in kvps)
{
o.Add(kvp);
}
Questo è OK al momento della compilazione, ma a tempo di esecuzione ottengo un YSOD affermando 'System.Dynamic.ExpandoObject' non contiene una definizione per ' Aggiungi' - Credo che funziona al momento della compilazione perché o
è dinamico, in modo che il compilatore non può sapere se un metodo .Add()
è stato aggiunto ad esso da quando è stato istanziato. La cosa strana è che sul MSDN documenation page for ExpandoObject.Add()
è elencato come uno dei numerosi "metodi di interfaccia esplicitamente implementati".
Non è necessario per me ottenere questo in un oggetto dinamico: ho solo bisogno di ottenere qualcosa che abbia nomi e valori di proprietà in base alle chiavi e ai valori delle coppie chiave-valore.
Aggiornamento: Bene, questo è imbarazzante. Risulta che anche questo era qualcosa di un problema XY.
Sto provando a renderlo a JSON utilizzando le funzionalità integrate di ASP.NET MVC, semplicemente restituendo Json(data)
nel mio controller. Le risposte tutti hanno lavorato molto bene a fare quello che ho chiesto, ma quando passo questo oggetto come data
io ancora non si ottiene quello che voglio:
// What I get:
[
{ Key: 'firstkey', Value: 'FirstValue' },
{ Key: 'secondKey', Value: 'secondValue' }
]
// What I want:
{ firstKey: 'FirstValue', secondKey: 'secondValue' }
A quanto pare, un ExpandoObject
con le proprietà rilevanti aggiunto non l'ha fatto tagliare - è stata lanciata a un dizionario prima del rendering ...
E sì, ho visto [questa domanda] (http://stackoverflow.com/questions/4685575/converting-a-keyvaluepair-collection-in-to-anonymous-type). Era davvero un [problema XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), che è stato risolto senza aiutarmi. –