2017-08-11 10 views
1

オブジェクトの配列があり、すべてのオブジェクトの内部にネストされた共通のプロパティでグループ化したい。私は悩みにそれを説明しようとしていますので、私は、オブジェクトの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()) 
    ) 

私はまた、代わりにToLookupのToDictionaryてみましたが、私はあなたがあなたの構造を示すために、C#の匿名オブジェクトを使用する場合は、/貼り付けをコピーする非常に簡単である重複キーの例外に

+0

問題の可能性があるSelectManyは必要ありません。 GroupByは選択を行います。 – jdweng

+0

私がSelectManyを使用した理由は、すべての質問オブジェクトを 'content'リストから単一の配列に抽出することで、レビュークラスを取り除くことができ、質問だけをリストに入れることができます。同じ結果を達成するためにGroupByをどのように使うことができるのか、私は本当に分かりません。 – Zephy

+0

これを試してみてください:.GroupBy(x => x.QuestionId) .Select(x => x新しい{質問= y => y.QuestionContent、答え= y => y.Answers.ToList()}) .SelectMany(x => x).ToList(); – jdweng

答えて

1

を取得します。いずれにしても、答えを組み合わせるには別のSelectManyを使用する必要があります。

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() }) }); 
+0

これは完全に動作し、私が望むものを正確に行います。どうもありがとう – Zephy

関連する問題