Лямбда, чтобы найти объект в рваной иерархии (или изменить объектную модель) - PullRequest
0 голосов
/ 05 апреля 2019

Я не могу понять, как построить лямбду, чтобы найти узел, когда иерархия неровная. Я спорю об изменении объектной модели, чтобы она не была неровной, или спрашиваю, может ли кто-нибудь помочь с лямбдой в случае того же самого ниже.

Учитывая, что у меня есть объект опроса, у которого есть список объектов вопросов, а у каждого вопроса есть список объектов ответов, проблема в том, что ответ может привести к другому вопросу. Я не знал, как построить лямбду, чтобы искать не только все вопросы в опросе, но также и все ответы, которые также могут иметь вопросы, вплоть до конца всех возможных путей. Чего я не пробовал, так это в основном сдаться и перенастроить объектную модель, чтобы у меня был простой список вопросов и ответов.

public void OnPostAddResponse(int questionid)
{

    //find question so we can add response to it
    SurveyQuestion q = this.SurveyObject.Questions.First(x => x.QuestionId == questionid);
    if (q.ResponseList == null)
    {
        q.ResponseList = new List<SurveyResponse>();
    }
    int newid = (q.QuestionId * 1000) + q.ResponseList.Count + 1;
    q.ResponseList.Add(new SurveyResponse(newid));

}
public class Survey
{
    public string SurveyName { get; set; }
    public List<SurveyQuestion> Questions { get; set; }
    public Survey()
    {
        this.SurveyName = "new survey name here";
        this.Questions = new List<SurveyQuestion>();
    }
}
public class SurveyQuestion
{
    public int QuestionId { get; set; }
    public string Question { get; set; }
    public List<SurveyResponse> ResponseList { get; set; }
    public SurveyQuestion() { }
    public SurveyQuestion(int id)
    {
        this.QuestionId = id;
        this.Question = "question text for id " + id;
        this.ResponseList = new List<SurveyResponse>();
    }
}
public class SurveyResponse
{
    public int ResponseId { get; set; }
    public string Response { get; set; }
    public SurveyQuestion NextQuestion { get; set; }
    public SurveyResponse() { }
    public SurveyResponse(int id)
    {
        this.ResponseId = id;
        this.Response = "response text for id " + id;
    }
}

Мне бы хотелось, чтобы OnPostAddResponse мог выполнять поиск по всему объекту опроса и находить переданный идентификатор вопроса, даже если это может быть вопрос, находящийся под объектом ответа.

Или вместо этого следует перенастроить объектную модель, чтобы опрос имел плоский список вопросов и ответов, которые затем были связаны их полями идентификаторов. Я думаю, что это решит проблему, но я не уверен, что это затруднит другие аспекты в будущем.

1 Ответ

1 голос
/ 05 апреля 2019

Рекурсивный запрос LINQ:

public static IEnumerable<SurveyQuestion> Flatten(IEnumerable<SurveyQuestion> source)
{
    return source.Concat(source.SelectMany(q => Flatten(q.ResponseList.Where(r => r.NextQuestion != null).Select(r => r.NextQuestion))));
}

Использование:

var allQuestions = Flatten(survey.Questions);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...