我可以将List <object>展平为具有每个项目属性的匿名对象吗?

时间:2016-09-02 15:15:53

标签: c# linq list anonymous-types

我正在尝试将对象列表压缩成一个匿名对象。

例如,假设我有:

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
}

是我想要在更大/更通用的范围内做什么?

4 个答案:

答案 0 :(得分:3)

是的,使用ExpandoObject

var o = new ExpandoObject() as IDictionary<string,object>;

o.Add("Tag1", true);
o.Add("Tag2", true);
o.Add("Tag3", false);

通过这种方式,您实际上是在向ExpandoObject添加属性

答案 1 :(得分:1)

我认为你不想压平某些东西,而是将你的列表变成字典:

Dictionary<string, bool> = tags.ToDictionary(tag => tag.id, tag => tag.value);

我不太确定您对“更大/更通用的比例”的意思,也许您可​​以编辑您的问题并添加更完整的示例。

答案 2 :(得分:0)

可以使用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 

答案 3 :(得分:0)

以下是如何做你想做的事情(我赞成你接受的答案,但实际上我认为你不需要这样做。我给你做了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); 
            }