Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用subselect和groupby进行LINQ,以仅获取列表中每个项目的最新版本_C#_Linq_Lambda - Fatal编程技术网

C# 使用subselect和groupby进行LINQ,以仅获取列表中每个项目的最新版本

C# 使用subselect和groupby进行LINQ,以仅获取列表中每个项目的最新版本,c#,linq,lambda,C#,Linq,Lambda,说到林克,我是个新手 我有一个IEnumerable通用列表,其中包含不同版本的答案(每个答案都带有问题的FK)。从这个列表中,我只需要一本最新版本答案的字典 非常简化的类图: 问题 -ID -问题 -……其他财产 回答 -ID -版本 -问题ID -值 -……其他财产 目前我有以下几点: IEnumerable<Answer> answers = GetAnswers(); IDictionary<long, AnswerDTO> latestVersionAnswe

说到林克,我是个新手

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

非常简化的类图:

问题
-ID
-问题
-……其他财产

回答
-ID
-版本
-问题ID
-值
-……其他财产

目前我有以下几点:

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);
        }
IEnumerable,但这同样只会返回键和一个属性:Version)
  • 最终,在这种特殊情况下,我更愿意只“过滤”原始列表并返回原始答案项,而不是让回答者参与

  • 任何指点或帮助都将不胜感激

    我只需重写数据模型以包含当前答案版本ID。

    类似于

       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;
        }
    
    private void按钮1\u单击(对象发送者,事件参数e)
    {
    List=GetAnswers();
    var dict=(来自in列表
    a组由a.QuestionID进入grp
    从g到grp
    其中g.Version==grp.Max(m=>m.Version)
    选择new{id=g.QuestionID,q=g}).ToDictionary(o=>o.id,o=>o.q);
    StringBuilder sb=新的StringBuilder();
    foreach(dict中的变量元素)
    {
    sb.AppendLine(elem.Key.ToString()+“-”+elem.Value.Version.ToString());
    }
    Show(sb.ToString());
    }
    私有列表GetAnswers()
    {
    列表结果=新列表();
    添加(新答案(){ID=1,QuestionID=1,Version=1});
    添加(新答案(){ID=2,QuestionID=1,Version=2});
    添加(新答案(){ID=3,QuestionID=1,Version=3});
    添加(新答案(){ID=4,QuestionID=2,Version=1});
    添加(新答案(){ID=5,QuestionID=2,Version=2});
    添加(新答案(){ID=6,QuestionID=2,Version=3});
    添加(新答案(){ID=7,QuestionID=3,Version=1});
    添加(新答案(){ID=8,QuestionID=3,Version=2});
    添加(新答案(){ID=9,QuestionID=3,Version=3});
    添加(新答案(){ID=10,QuestionID=3,Version=4});
    返回结果;
    }
    
    或者,如果您更喜欢ToDictionary的选择重载:

    latestVersionAnswers = answers
      .GroupBy(e => e.Question.ID)
      .ToDictionary(
        g => g.Key,
        g => g.OrderByDescending(e => e.Version).First()
      );
    

    正是我想要的。你就是这么做的!谢谢你的及时答复。
    latestVersionAnswers = answers
      .GroupBy(e => e.Question.ID)
      .ToDictionary(
        g => g.Key,
        g => g.OrderByDescending(e => e.Version).First()
      );