C# 按公共字段统计嵌套类中的重复对象

C# 按公共字段统计嵌套类中的重复对象,c#,linq,C#,Linq,我有一个对象数组,我想通过嵌套在每个对象中的公共属性对它们进行分组。由于我在解释时遇到困难,我将发布一个类似JSON的对象表示: reviewList: [{ // review object userObject: {...} content: [ { questionContent: "what sweets do you think John likes?", questionId: 2,

我有一个对象数组,我想通过嵌套在每个对象中的公共属性对它们进行分组。由于我在解释时遇到困难,我将发布一个类似JSON的对象表示:

reviewList: [{ // review object
    userObject: {...}
    content: [
        { 
            questionContent: "what sweets do you think John likes?",
            questionId: 2,
            answers: [{answer:"Candy"},{answer:"Chocolate"}]
        },
        { 
            questionContent: "Do you like john?",
            questionId: 3,
            answers: [{answer:"No"}]
        }
    ]
},
{ // review object
    userObject: {...}
    content: [ // Questions
        { 
            questionContent: "what sweets do you think John likes?",
            questionId: 2,
            answers: [{answer:"Candy"}]
        },
        { 
            questionContent: "Do you like john?",
            questionId: 3,
            answers: [{answer:"Yes"}]
        }
    ]
}]
我想从中得到的是一个对象列表,它看起来很像下面的示例:

[{
    content: 'what sweets do you think John likes?', 
    answers: [{content: "Candy", count: 2}, {content:"chocolate", count:1}]
},{
    content: 'Do you like john?', 
    answers: [{content: "Yes", count: 1}, {content:"No", count:1}]
}]
到目前为止,我已经尝试了以下linq代码,但我真的不知道如何继续,或者我是否在正确的道路上使用它

reviewList
    .SelectMany(x => x.Questions)
    .GroupBy(x=>x.QuestionId)
    .Select(x=>x
        .ToLookup(y=>y.QuestionContent, y=>y.Answers.ToList())
    )

我也尝试使用ToDictionary而不是ToLookup,但我得到了重复的密钥异常

如果使用C#匿名对象来显示结构,复制/粘贴会容易得多。在任何情况下,您都需要使用另一个
选择many
组合答案:

var ans = reviewList.SelectMany(r => r.content).GroupBy(r => r.questionContent).Select(r => new { content = r.Key, answers = r.SelectMany(a => a.answers).GroupBy(a => a.answer).Select(a => new { content = a.Key, Count = a.Count() }) });

您不需要选择许多可能是您的问题。GroupBy将进行选择。我使用SelectMany的原因是将
内容
列表中的所有问题对象提取到一个数组中,这样我就可以摆脱review类,只将问题放在一个列表中。我真的不确定如何使用GroupBy来实现相同的结果。请尝试以下方法:reviewList.GroupBy(x=>x.QuestionId)。选择(x=>x new{question=y=>y.QuestionContent,answer=y=>y.Answers.ToList())。选择多个(x=>x.ToList();这工作非常完美,完全符合我的要求。谢谢