我可以将 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); 
            }