我可以将 List<object> 展平为具有每个项目属性的匿名对象吗?
Can I flatten a List<object> to an anonymous object with properties for each item?
我正在尝试将对象列表扁平化为匿名对象。
例如假设我有:
List<Tag> tags = new List<Tag>();
tags.Add(new Tag(id: "Tag1", value:true));
tags.Add(new Tag(id: "Tag2", value:true));
tags.Add(new Tag(id: "Tag3", value:false));
然后我想将此列表扁平化为匿名对象,例如:
tags.Select(x => new
{
Tag1 = true,
Tag2 = true,
Tag3 = false
}
我正在尝试做的事情在更大/更通用的范围内是否可行?
是,使用 ExpandoObject:
var o = new ExpandoObject() as IDictionary<string,object>;
o.Add("Tag1", true);
o.Add("Tag2", true);
o.Add("Tag3", false);
通过这种方式,您实际上是在向 ExpandoObject 添加属性
我认为你不想展平某些东西,而是想把你的列表变成字典:
Dictionary<string, bool> = tags.ToDictionary(tag => tag.id, tag => tag.value);
我不太确定你说的 "a bigger/more generic scale" 是什么意思,也许你可以编辑你的问题并添加一个更完整的例子。
可以使用 json.net 通过此 hack 来完成...我认为它没有那么有用,但只是为了演示它是可能的...
dynamic theflat =
JsonConvert.DeserializeObject(
$"{{{tags.Select( x => $"\"{x.ID}\":\"{x.Value}\"" ).Aggregate( ( p, n ) => $"{p},{n}" )}}}" );
;
代码创建所有标签的 json 序列化版本,然后将它们反序列化为动态。你可以测试它:
Console.WriteLine(theflat.Tag1); //true
Console.WriteLine( theflat.Tag2 ); //true
Console.WriteLine( theflat.Tag3 ); //false
这里是如何做你想做的事(我赞成接受的答案,但实际上我认为你不需要那样做。我给你做了 FIDDLE
List<Tag> tags = new List<Tag>()
{
new Tag(id: "Tag1", val:true),
new Tag(id: "Tag2", val:true),
new Tag(id: "Tag3", val:false)
};
var dict = new Dictionary<string, bool>();
foreach(Tag tag in tags)
{
dict.Add(tag.Id, tag.Val);
}
我正在尝试将对象列表扁平化为匿名对象。
例如假设我有:
List<Tag> tags = new List<Tag>();
tags.Add(new Tag(id: "Tag1", value:true));
tags.Add(new Tag(id: "Tag2", value:true));
tags.Add(new Tag(id: "Tag3", value:false));
然后我想将此列表扁平化为匿名对象,例如:
tags.Select(x => new
{
Tag1 = true,
Tag2 = true,
Tag3 = false
}
我正在尝试做的事情在更大/更通用的范围内是否可行?
是,使用 ExpandoObject:
var o = new ExpandoObject() as IDictionary<string,object>;
o.Add("Tag1", true);
o.Add("Tag2", true);
o.Add("Tag3", false);
通过这种方式,您实际上是在向 ExpandoObject 添加属性
我认为你不想展平某些东西,而是想把你的列表变成字典:
Dictionary<string, bool> = tags.ToDictionary(tag => tag.id, tag => tag.value);
我不太确定你说的 "a bigger/more generic scale" 是什么意思,也许你可以编辑你的问题并添加一个更完整的例子。
可以使用 json.net 通过此 hack 来完成...我认为它没有那么有用,但只是为了演示它是可能的...
dynamic theflat =
JsonConvert.DeserializeObject(
$"{{{tags.Select( x => $"\"{x.ID}\":\"{x.Value}\"" ).Aggregate( ( p, n ) => $"{p},{n}" )}}}" );
;
代码创建所有标签的 json 序列化版本,然后将它们反序列化为动态。你可以测试它:
Console.WriteLine(theflat.Tag1); //true
Console.WriteLine( theflat.Tag2 ); //true
Console.WriteLine( theflat.Tag3 ); //false
这里是如何做你想做的事(我赞成接受的答案,但实际上我认为你不需要那样做。我给你做了 FIDDLE
List<Tag> tags = new List<Tag>()
{
new Tag(id: "Tag1", val:true),
new Tag(id: "Tag2", val:true),
new Tag(id: "Tag3", val:false)
};
var dict = new Dictionary<string, bool>();
foreach(Tag tag in tags)
{
dict.Add(tag.Id, tag.Val);
}