C# 在LINQ查询中将KeyValuePair转换为匿名类型

C# 在LINQ查询中将KeyValuePair转换为匿名类型,c#,.net,json,linq,C#,.net,Json,Linq,我有一个IEnumerable,理想情况下,我希望从中得到一个匿名对象,该对象的键作为属性名,值作为属性值 我尝试过各种选择表达式(没有一个是编译过的…)和使用ExpandoObject(见下文)的方法,但都没有成功。有什么好办法吗?如果可能的话,我希望避免在集合上进行额外的显式迭代(即使用某种LINQ语句来完成这一切) 这就是我到目前为止所尝试的。我希望这也能澄清我想做的事情: var kvps = getProps(); // returns IEnumerable<KeyValueP

我有一个
IEnumerable
,理想情况下,我希望从中得到一个匿名对象,该对象的键作为属性名,值作为属性值

我尝试过各种选择表达式(没有一个是编译过的…)和使用
ExpandoObject
(见下文)的方法,但都没有成功。有什么好办法吗?如果可能的话,我希望避免在集合上进行额外的显式迭代(即使用某种LINQ语句来完成这一切)

这就是我到目前为止所尝试的。我希望这也能澄清我想做的事情:

var kvps = getProps(); // returns IEnumerable<KeyValuePair<string,string>>

dynamic o = new ExpandoObject();
foreach (var kvp in kvps)
{
    o.Add(kvp);
}

显然,添加了相关属性的
ExpandoObject
并没有剪切它-它在呈现之前被强制转换到字典中…

在填充它时,您需要将
ExpandoObject
用作
IDictionary

var kvps = getProps(); // returns IEnumerable<KeyValuePair<string,string>>

IDictionary<string, object> o = new ExpandoObject();
foreach (var kvp in kvps)
{
    // Or use Add(kvp.Key, kvp.Value), if you want
    o[kvp.Key] = kvp.Value;
}

dynamic d = o;
// Now you can use the properties
var kvps=getProps();//返回IEnumerable
IDictionary o=新的ExpandooObject();
foreach(以kvps为单位的var kvp)
{
//如果需要,也可以使用Add(kvp.Key、kvp.Value)
o[kvp.Key]=kvp.Value;
}
动态d=o;
//现在您可以使用属性

我认为您必须将expando对象强制转换为IDictionary并调用Add(string,object)

ExpandooObject
显式实现
IDictionary
-因此您需要先将其强制转换为一个:

var kvps = getProps();
dynamic o = new ExpandoObject();
var dict = o as IDictionary<string, object>;
foreach (var kvp in kvps)
{
    dict.Add(kvp.Key, kvp.Value);
}
我试图使用ASP.NET MVC的内置功能将其呈现为JSON,只需在控制器中返回JSON(数据)

有趣

为此,需要序列化字典,而不是ExpandooObject。MVC 3的JSON序列化程序已经通过字典实现了这一点。您只需将
IEnumerable
转换为字典:

var kvps = getProps();
var dictionary = kvps.ToDictionary(k => k.Key, v => v.Value);
return Json(dictionary, JsonRequestBehavior.AllowGet); //take out allow get if you don't need it.

不需要动力。

是的,我看到了。这确实是一个问题,没有帮助我就解决了。这在第一行给了我一个编译错误(
IDictionary o=new ExpandoObject();
),但因为是你,我认为编译器是错的。我猜它认为应该是
IDictionary
-我会立即告诉它你说过这样做的。@托马斯利肯:我已经用
对象
字符串
更改了我的帖子,谢谢。不过,剩下的部分似乎取决于JSON转换器。您可能会发现另一个JSON序列化框架(例如JSON.NET)修复了它。谢谢!然而,我的问题有点太快了-请看我的更新…@TomasLycken我对更新的代码有一个小问题,我有
ToDictionary(k=>k.Value,v=>v.Value)
而不是
ToDictionary(k=>k.Key,v=>v.Value)ToDictionary(kvp=>kvp.Key,kvp=>kvp.Value)
,然后它完全按照我想要的做了。)
var example = o.YourKey;
var kvps = getProps();
var dictionary = kvps.ToDictionary(k => k.Key, v => v.Value);
return Json(dictionary, JsonRequestBehavior.AllowGet); //take out allow get if you don't need it.