使用C#展平Linq中的对象

时间:2018-07-12 18:23:29

标签: c# linq flatten

我有一个数据对象,该对象已从json响应中反序列化,其属性格式为:
[0] ....
GroupName:“组1”
成员列表:[用户ID的字符串数组]
[1]
GroupName:“第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();

但这不会返回我上面期望的结果。

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

JSON SNIPPET:

  "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; }

    }
}

1 个答案:

答案 0 :(得分:0)

这应该对您有用:

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

如果将结果选择器函数传递给SelectMany调用,则可以使用该函数将“父项(在这种情况下为GroupName)与“子”值(在这种情况下为User ID)合并在一起。

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