【问题标题】:Flatten Object in Linq using c#使用 c# 在 Linq 中展平对象
【发布时间】:2018-12-21 01:44:29
【问题描述】:

我有一个从 json 响应反序列化的 Data 对象,该响应具有以下格式的属性:
[0] ....
组名:“组 1”
成员​​列表:[UserID 的字符串数组]
[1]
组名:“第 2 组”
成员​​列表:[UserID 的字符串数组]

。等等

我想将其展平,使其仅返回 2 列,例如:
用户 ID、名称
1,第 1 组
2,第 1 组
3,第 1 组
4,第 2 组
5,第 2 组
等等。

UserID 在所有组中都是唯一的,即用户只是 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 片段:

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

    }
}

【问题讨论】:

  • 如果你发布一个json对象的样本会更好,第一行反序列化的类型是什么/显示GroupDetailResponse类?
  • 现在已经在上面添加了这些细节。为含糊而道歉!

标签: c# linq flatten


【解决方案1】:

这应该适合你:

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

如果您将结果选择器函数传递给您的 SelectMany 调用,则可以使用它将“父”(在本例中为 GroupName)与“子”值(在本例中为用户 ID)合并在一起。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    相关资源
    最近更新 更多