我正在尝试将对象列表压缩成一个匿名对象。
例如,假设我有:
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
}
是我想要在更大/更通用的范围内做什么?
答案 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);
}