Получите отличительные свойства с помощью Linq - PullRequest
0 голосов
/ 14 июля 2020

У меня есть список объектов, для которых нужно показать отдельные свойства, и список приведен ниже:

public class Questions
{
    public Nullable<int> QuestionId { get; set; }
    public string QuestionName { get; set; }
    public string Options { get; set; }
}

public List<Questions> GetLst()
{
    List<Questions> aLst = new List<Questions>()
    {
        new Questions() { QuestionId = 1, QuestionName = "What is the capital of England?", Options = "London" },
        new Questions() { QuestionId = 1, QuestionName = "What is the capital of Engand?", Options = "Jakarta" },
        new Questions() { QuestionId = 2, QuestionName = "Who invented computer?", Options = "Thomas Edison" },
        new Questions() { QuestionId = 2, QuestionName = "Who invented computer?", Options = "Charles Babbage" },
    };

    return aLst;
}

Итак, как видно, в списке повторяются значения свойств, например ИД вопроса и Имя вопроса . Итак, во внешнем интерфейсе я использую Razor, чтобы показать список, и просто l oop повторяется как номер данного объекта.

 @foreach (var item in Model.Distinct())          
 {
     <div class="heading">
        <div class="h2Val">
            @item.QuestionId
        </div>
     <div>@item.QuestionName</div>

     @foreach (var item2 in Model.Where(c => c.QuestionId == item.QuestionId))
     {
         <div class="heading2">
           <div>
             <input type="checkbox" class="cbCheck" value="@item2.Options" />@item2.Options
           </div>
         </div>
     }
     <div>
       <input type="button" class="btn" value="Get Value" />
     </div>
    </div>
 }

Итак, мой ожидаемый результат выглядит следующим образом:

1
What's the capital of England?
Option 1: London
Option 2: Jakarta

Что я сейчас получаю:

1
What's the capital of England?
Option 1: London

1
What's the capital of England?
Option 2: Jakarta

Я пробовал что-то вроде этого, чтобы различать значения свойств следующим образом, но это совсем не помогло: (Любая идея получше разрешите его, используя Razor или Linq)

aLst = db.Questions.DistinctBy(p => new { p.QuestionId, p.QuestionName, p.Options }).ToList(); 

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вы можете использовать GroupBy следующим образом:

        var questions = Questions.GetLst()
                         .GroupBy(q => new
                         {
                             q.QuestionId,
                             q.QuestionName
                         }, p => p.Options)
                         .Select(
                             grp => new
                             {
                                 Id = grp.Key.QuestionId,
                                 Name = grp.Key.QuestionName,
                                 Options = grp.ToList()
                             }
                         );

        foreach(var question in questions)
        {
            Console.WriteLine(question.Id);
            Console.WriteLine(question.Name);

            foreach(string option in question.Options)
            {
                Console.WriteLine(option);
            }
        }

Я тестировал это в консоли, и результат:

1
What is the capital of England?
London
Jakarta
2
Who invented computer?
Thomas Edison
Charles Babbage
2 голосов
/ 14 июля 2020
 @foreach(var item in Model.GroupBy(x=> x.QuestionId))          
 {
     <div class="heading">
        <div class="h2Val">
            @item.Key
        </div>
     <div>@item.FirstOrDefault()?.QuestionName</div>

     @foreach(var item2 in item.Select(x=>x.Options).ToList())
     {
         <div class="heading2">
           <div>
             <input type = "checkbox" class="cbCheck" value="@item2" />@item2
             </div>
         </div>
     }
     <div>
       <input type = "button" class="btn" value="Get Value" />
     </div>
    </div>
 }
...