gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:23:35 25 4
gpt4 key购买 nike

我有一个 IEnumerable<KeyValuePair<string,string>> ,理想情况下,我想要一个匿名对象,它将键作为属性名称,将值作为属性值。

我已经尝试了各种选择表达式(甚至都没有编译...)和一种使用 ExpandoObject 的方法(见下文),但没有成功。有没有好的方法来做到这一点?如果可能,我想避免对集合进行额外的显式迭代(即使用某种 LINQ 语句完成所有操作)。

这是我迄今为止尝试过的。我希望它也能阐明我正在尝试做的事情:

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

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

这在编译时没问题,但在运行时我得到一个 YSOD说明 'System.Dynamic.ExpandoObject' 不包含 'Add' 的定义 - 我猜它在编译时有效,因为 o是动态的,所以编译器不知道方法是否为 .Add()自实例化以来已添加到其中。奇怪的是,在 MSDN documenation page for ExpandoObject.Add()被列为几个“显式实现的接口(interface)方法”之一。

我没有必要将它放入动态对象中 - 我只需要根据键值对的键和值获取具有属性名称和值的东西。

更新:好吧,这很尴尬。事实证明,这也是一个 XY 问题。

我正在尝试使用 ASP.NET MVC 的内置功能将其呈现为 JSON,只需返回 Json(data)在我的 Controller 中。答案都很好地完成了我第一次提出的问题,但是当我将这个对象作为 data 传递时我仍然没有得到我想要的:

// What I get:
[
{ Key: 'firstkey', Value: 'FirstValue' },
{ Key: 'secondKey', Value: 'secondValue' }
]

// What I want:
{ firstKey: 'FirstValue', secondKey: 'secondValue' }

显然,一个 ExpandoObject添加了相关属性并没有削减它 - 它在渲染之前被转换为字典......

最佳答案

您需要使用 ExpandoObject作为IDictionary<string, object>在填充它时:

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

关于c# - 在 LINQ 查询中将 KeyValuePair 转换为匿名类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11191280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com