LINQ с подвыбором и groupby для получения только последней версии каждого объекта в списке

Во-первых, я не думаю, что вам нужно loopExpect, потому что есть более простой и надежный способ реализовать это:

test('check contains Book property', async () =>
    [{title: 'SOLID Principles', author: 'Uncle Bob Martin'}].forEach(book => 
        expect(book).toContainKeys(['year'])
    )
)

Но если вам действительно нужна вспомогательная функция, вам нужно узнать, где тест не удался, один из способов узнать, это посмотреть трассировку стека. И если вы хотите, чтобы ошибка имела другую трассировку стека с линией из вашего тестового файла вверху, тогда вы можете заключить свой тест в блок try и выдать новую ошибку из блока catch. [115 ]

9
задан Community 23 May 2017 в 12:09
поделиться

3 ответа

Как насчет чего-то как....

   private void button1_Click(object sender, EventArgs e)
    {
      List<Answer> list = GetAnswers();

      var dict = (from a in list
                 group a by a.QuestionID into grp
                 from g in grp
                 where g.Version == grp.Max(m => m.Version)
                 select new { id = g.QuestionID, q = g }).ToDictionary( o => o.id, o => o.q);

      StringBuilder sb = new StringBuilder();
      foreach (var elem in dict)
      {
        sb.AppendLine(elem.Key.ToString() + "-" + elem.Value.Version.ToString());
      }
      MessageBox.Show(sb.ToString());
    }

    private List<Answer> GetAnswers()
    {
      List<Answer> result = new List<Answer>();
      result.Add(new Answer() { ID = 1, QuestionID = 1, Version = 1 });
      result.Add(new Answer() { ID = 2, QuestionID = 1, Version = 2 });
      result.Add(new Answer() { ID = 3, QuestionID = 1, Version = 3 });
      result.Add(new Answer() { ID = 4, QuestionID = 2, Version = 1 });
      result.Add(new Answer() { ID = 5, QuestionID = 2, Version = 2 });
      result.Add(new Answer() { ID = 6, QuestionID = 2, Version = 3 });
      result.Add(new Answer() { ID = 7, QuestionID = 3, Version = 1 });
      result.Add(new Answer() { ID = 8, QuestionID = 3, Version = 2 });
      result.Add(new Answer() { ID = 9, QuestionID = 3, Version = 3 });
      result.Add(new Answer() { ID = 10, QuestionID = 3, Version = 4 });
      return result;
    }
8
ответ дан 4 December 2019 в 14:32
поделиться
latestVersionAnswers = answers
  .GroupBy(e => e.Question.ID)
  .Select(g => g.OrderByDescending(e => e.Version).First())
  .ToDictionary(e => e.Question.ID);

Или, если Вы предпочитаете перегрузку выбора ToDictionary:

latestVersionAnswers = answers
  .GroupBy(e => e.Question.ID)
  .ToDictionary(
    g => g.Key,
    g => g.OrderByDescending(e => e.Version).First()
  );
6
ответ дан 4 December 2019 в 14:32
поделиться

Я просто переписал бы модель данных для включения текущего идентификатора версии ответа.

0
ответ дан 4 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: