加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – LINQ with subselect和groupby只能获取列表中每个项目的最

发布时间:2020-12-15 04:23:28 所属栏目:百科 来源:网络整理
导读:对于LINQ来说,我是个新手 我有一个IEnumerable通用列表,其中包含不同版本的答案(每个都有一个FK的问题).从这个列表中我只需要获得最新版本的答案字典. 一个非常简化的类图: 题 -ID -题 – …其他属性 回答 -ID -版 -QuestionID -值 – …其他属性 目前我已
对于LINQ来说,我是个新手

我有一个IEnumerable通用列表,其中包含不同版本的答案(每个都有一个FK的问题).从这个列表中我只需要获得最新版本的答案字典.

一个非常简化的类图:


-ID
-题
– …其他属性

回答
-ID
-版
-QuestionID
-值
– …其他属性

目前我已经得到以下几点:

IEnumerable<Answer> answers = GetAnswers();

IDictionary<long,AnswerDTO> latestVersionAnswers = new Dictionary<long,AnswerDTO>();
if (answers != null)
{
latestVersionAnswers = answers
      .OrderBy(e => e.ID)
      .GroupBy(e => e.Question.ID)
      .Select(g => new AnswerDTO
                        {
                             Version = g.Last().Version,// g.Select(e => e.Version).Max(),QuestionID = g.Key,ID = g.Last().ID,Value = g.Last().Value
                                 }).ToDictionary(c => c.QuestionID);
        }

虽然这在很大程度上起作用,但您可以快速看到它需要一些严重的优化(并且有点脆弱,因为它取决于答案记录行顺序而不是“最大”逻辑).使用LINQ做什么最好的方式,或者最好是为每个循环做多个?

>如果我只需要版本(而不是ID,Value等),我不需要OrderBy,因为我可以去g.Select(e => e.Version).Max()(或我’现在已经看到了C# List<> GroupBy 2 Values的帖子,但是这又会返回key / s和一个属性:Version).
>最终,在这种特殊情况下,我更愿意只是“过滤”原始列表,并返回原始的答案而不是涉及到AnswerDTO.

任何指针或帮助将不胜感激!

解决方法

像….
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,Version = 2 });
      result.Add(new Answer() { ID = 3,Version = 3 });
      result.Add(new Answer() { ID = 4,QuestionID = 2,Version = 1 });
      result.Add(new Answer() { ID = 5,Version = 2 });
      result.Add(new Answer() { ID = 6,Version = 3 });
      result.Add(new Answer() { ID = 7,QuestionID = 3,Version = 1 });
      result.Add(new Answer() { ID = 8,Version = 2 });
      result.Add(new Answer() { ID = 9,Version = 3 });
      result.Add(new Answer() { ID = 10,Version = 4 });
      return result;
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读