C# 我可以将列表展平吗<;对象>;是否指向每个项都具有属性的匿名对象?

C# 我可以将列表展平吗<;对象>;是否指向每个项都具有属性的匿名对象?,c#,linq,list,anonymous-types,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)); 我尝试在更大/更通用的范围内做的事情是否可行?是,使用: var o=newexpando

我正在尝试将对象列表展平为注释性对象

例如,假设我有:

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));
我尝试在更大/更通用的范围内做的事情是否可行?

是,使用:

var o=newexpandoobject()作为IDictionary;
o、 添加(“Tag1”,正确);
o、 添加(“Tag2”,正确);
o、 添加(“Tag3”,假);
通过这种方式,您实际上是在使用以下命令向ExpandooObject添加属性:

var o=newexpandoobject()作为IDictionary;
o、 添加(“Tag1”,正确);
o、 添加(“Tag2”,正确);
o、 添加(“Tag3”,假);
通过这种方式,您实际上是在向ExpandoObject添加属性,我认为您不想展平某些内容,而是想将列表变成字典:

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

我不太清楚你所说的“更大/更一般的规模”是什么意思,也许你可以编辑你的问题并添加一个更完整的例子。

我认为你不想把一些东西压扁,而是想把你的列表变成一本字典:

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


我不太清楚你说的“更大/更一般的规模”是什么意思,也许你可以编辑你的问题并添加一个更完整的例子。

这可以通过使用json.net来完成。。。我不认为这是有用的,但只是为了演示它是可能的

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 

这可以通过使用json.net来完成。。。我不认为这是有用的,但只是为了演示它是可能的

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 

下面是如何做你想做的事情(我对被接受的答案投了赞成票,但实际上我认为你不需要这样做。我给了你一个

List tags=newlist()
{
新标签(id:“Tag1”,val:true),
新标签(id:“Tag2”,val:true),
新标签(id:“Tag3”,val:false)
};
var dict=新字典();
foreach(标记中的标记)
{   
dict.Add(tag.Id,tag.Val);
}

以下是如何做你想做的事(我对被接受的答案投了赞成票,但实际上我认为你不需要这样做。我给了你一个

List tags=newlist()
{
新标签(id:“Tag1”,val:true),
新标签(id:“Tag2”,val:true),
新标签(id:“Tag3”,val:false)
};
var dict=新字典();
foreach(标记中的标记)
{   
dict.Add(tag.Id,tag.Val);
}

如果您不强式键入属性,那么您将无法访问这些属性…在这种情况下,您最好有一个
字典或类似的东西如果您不强式键入属性,那么您将无法访问它们…在这种情况下,您最好有一个
字典
或类似的东西这可以在
Select
SelectMany
中完成吗,这样我就可以在更大/更通用的范围内完成它?@user1:请看我的答案,尽管我假设你知道如何手工完成。我认为这个答案很棒,但我不确定你正在尝试的工作是否需要它。这是否可能实现o在
Select
SelectMany
中,这样我就可以在更大/更通用的范围内做这件事了?@user1:看看我的答案,尽管我认为你知道如何手工做。我认为这个答案很棒,但我不确定你想做的事情是否需要它。