通过一个参考对象过滤一长串对象

时间:2015-03-10 20:31:05

标签: c# linq

鉴于 a)已完成调查的长列表,其中完成的调查仅为

形式的(~100)答案列表。
  • QuestionId,
  • List GivenAnswers

b)一个过滤调查,其中一些答案已经预先选定(例如“女性”,“吸烟者”),我如何获得满足定义的标准的已完成调查的子集在过滤调查中?

编辑: 这些是相关的类:

public class Answer
{
    public int Id { get; set; }
    public Question Question { get; set; }
    public List<AnswerPossibility> SelectedAnswers { get; set; }
}

public class Survey
{
    public int Id { get; set; }
    public string Title { get; set; }
    public List<Question> Questions { get; set; }
}

public class CompletedSurvey
{
    public int Id { get; set; }
    public Survey Survey { get; set; }
    public List<Answer> Answers { get; set; }
}

public class Subset
{
    // used to define a filter criteria
    public int Id { get; set; }
    public Survey Survey { get; set; }
    public List<Answer> Answers { get; set; }
    public string Title { get; set; }
}

public class Question
{
    public int Id { get; set; }
    public string Text { get; set; }
    public QuestionType QuestionType { get; set; }
    public List<AnswerPossibility> AnswerPossibilities { get; set; }
}

到目前为止,我还没有提出可编译的东西:o(

哦,伙计,John Skeet对我的问题进行了低估。就是这样,我完成了编程......(开玩笑^^,我刚刚开始......)

1 个答案:

答案 0 :(得分:1)

假设存在,

  • CompletedSurvey key,其中描述了&#34;过滤器调查&#34;你提到的
  • IEnumerable<CompletedSurvey> answers,描述了人们的实际答案

然后你可以做这样的事情,

return answers.Select(survey => survey.Answers.Join(key.Answers,
                                                    a => a.Question.Id,
                                                    b => b.Question.Id,
                                                    (a, b) => new {
                                                                      answer = a,
                                                                      expected = b
                                                                  }))
              .Where(c => c.All(x => x.expected.SelectedAnswers
                                               .GroupJoin(x.answer.SelectedAnswers,
                                                          a => a.Id,
                                                          b => b.Id,
                                                          (a, b) => b.Any())));

这是完全未经测试的,我在答案框中写了这个,所以可能不对。您也可以清理它。但它应该让你开始。

我们的想法是完成已完成的调查,其中包含密钥中列出的答案(通过联接),然后仅采用那些包含密钥中存在的所有选定答案的调查(通过该组加入)。这是一种非常复杂的方式,我怀疑这是一个更好的方法,但这是我从你给我们的东西中得出的。