使用 C# 在 Linq 中展平对象

Flatten Object in Linq using c#

我有一个从 json 响应反序列化的数据对象,其属性格式如下:
[0] ....
组名:"Group 1"
成员列表:[UserID 的字符串数组]
[1]
组名:"Group 2"
成员列表:[UserID 的字符串数组]

。等等

我想将其展平,以便它只是 returns 2 列,例如:
用户ID,姓名
1 人,第 1 组
2,第 1 组
3,第 1 组
4,第 2 组
5,第 2 组
等等。

用户 ID 在所有组中都是唯一的,即用户只是 1 个组的成员

我试过:

var group = JsonConvert.DeserializeObject(<My Json File>);
var gpObject = JsonConvert.DeserializeObject<GroupDetailResponse>(group.ToString());
var memberGroup = gpObject.Data.Select(y => new { UserId = y.Memberlist.SelectMany(sl => y.memberlist).ToArray(), GroupName = y.Id }).ToArray();

但这 return 不是我上面所期望的。

任何帮助将不胜感激 - 谢谢。

JSON 片段:

  "data": [
    {
      "id": "ZZ1",
      "name": "Group1",
      "memberList": [
        "User1",
        "User2",
        "User3"
      ]
    },
    {
      "id": "ZZ2",
      "name": "Group2",
      "memberList": [
        "User4",
        "User5"
      ],
    }
   ]

以及 DTO:

public class GroupDetailResponse
    {

        [JsonProperty("data")]
        public GroupInformation[] Data { get; set; }
    }

    public class GroupInformation
    {
        [JsonProperty("id")]
        public string Id { get; set; }


        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("memberList")]
        public string[] MemberList { get; set; }

    }
}

这应该适合你:

var memberGroup1 = gpObject.SelectMany(x => x.Memberlist, (group, id) => new { id, group.GroupName});

如果您将结果选择器函数传递给您的 SelectMany 调用,您可以使用它将 "parent (GroupName in this case) with the "child" 值(在本例中为用户 ID)合并在一起。

这篇博客很好地解释了 SelectMany 的用法来展平对象,包括使用结果选择器:http://blogs.interknowlogy.com/2008/10/10/use-linqs-selectmany-method-to-flatten-collections/