public Respondent GetMinUser(Respondent r) { Respondent result = new Respondent(r, false); foreach (LinkedQuestion lq in Questions) { if (lq.GetQnumValue() <= StartQ) { continue; } // skip ones that already have an answer if (result.Responses.Any(x => x.VarName.Equals(lq.VarName.RefVarName))) { continue; } // skip ones that this user doesn't answer if (!UserGetsQuestion(result, lq)) { result.AddSkip(lq.VarName.RefVarName); continue; } int directFilterCount; int indirectFilterCount; List <LinkedQuestion> directFilterList = GetDirectFilterVarList(lq); directFilterCount = directFilterList.Count(); List <LinkedQuestion> indirectFilterList = new List <LinkedQuestion>(); try { if (lq.GetQnumValue() >= StartQ) { foreach (LinkedQuestion q in directFilterList) { indirectFilterList.AddRange(GetIndirectFilterVarList(q)); } } }catch (Exception e) { } indirectFilterList = indirectFilterList.Except(directFilterList).ToList(); indirectFilterCount = indirectFilterList.Count(); if (directFilterCount + indirectFilterCount == 0) { continue; } List <FilterInstruction> responses = lq.GetFiltersByResponse(); // get list of responses // for each response get direct count, get indirect count int min = 9999999; string minResp = ""; foreach (FilterInstruction fi in responses) { List <LinkedQuestion> directList = GetDirectFilterConditionList(fi); int directCount = directList.Count(); List <LinkedQuestion> indirectList = new List <LinkedQuestion>(); foreach (LinkedQuestion q in indirectFilterList) { if (QuestionHasIndirectFilter(q, fi)) { indirectList.Add(q); } } int indirectCount = indirectList.Count(); // for all responses, get the lowest number of direct+indirect // add that response to the respondent if (directCount + indirectCount < min) { min = directCount + indirectCount; minResp = fi.ValuesStr[0]; } } // if minResp = blank then no answer is used as a filter elsewhere so we can answer with anything if (string.IsNullOrEmpty(minResp)) { minResp = "0"; } result.AddResponse(lq.VarName.RefVarName, minResp); } return(result); }