加入我又这样一个集合List<Grade> gradeList = new List<Grade>() { 
                new Grade{ ID=1, UserID=100, _Grade=10, DT= DateTime.Parse("2010-10-12"),IsNormal=true  },
                new Grade{ ID=2, UserID=100, _Grade=20, DT= DateTime.Parse("2010-10-09"),IsNormal=true  },
                new Grade{ ID=3, UserID=200, _Grade=11, DT= DateTime.Parse("2010-10-11"),IsNormal=true  },
                new Grade{ ID=4, UserID=100, _Grade=18, DT= DateTime.Parse("2010-10-18"),IsNormal=true  },
                new Grade{ ID=5, UserID=300, _Grade=2, DT= DateTime.Parse("2010-10-10"),IsNormal=true  },
                new Grade{ ID=6, UserID=300, _Grade=15, DT= DateTime.Parse("2010-10-13"),IsNormal=true  },
                new Grade{ ID=7, UserID=300, _Grade=16, DT= DateTime.Parse("2010-10-02"),IsNormal=false  }
            };我想求Grade最大的那行的那个对象
我这样写var q = gradeList.Where(k => k._Grade == gradeList.Max(s => s._Grade));这没什么问题
然后我想用另一种写法 var query1 = from g in gradeList
                         where g.ID.Equals(from f in gradeList select gradeList.Max(s => s.ID))
                        select g;我这样写的时候,报错说无法将IEnumerable<int> 转化成int
我跟踪一下发现from f in gradeList select gradeList.Max(s => s.ID)这句返回的竟然不是一个int值而是一个集合而且集合中每个grade值都是相同的,都是最大值,这是为什么呢?
最后我只能用这种写法解决 var query1 = from g in gradeList
                         where g.ID.Equals((from f in gradeList select gradeList.Max(s => s.ID)).First())是不是有什么其他方法呢?另外,我想问一下这两种写法应该没什么本质区别是吧?那什么时候用哪种呢?我觉得下面这种在笔记哦啊复杂的逻辑时应用,不知道对不对!还请Tim分享一下这方面的心得。

解决方案 »

  1.   

    from f in gradeList select gradeList.Max(s => s.ID)
    虽然只有一个值,但返回的是一个数据集加个first()就是一个具体的值了
      

  2.   


    gradeList.Max应该返回的就是一个int值才对啊,求最大值为什么要返回一个集合呢?顶者有分都没人顶,快来顶!!
      

  3.   

    var query1 = from g in gradeList
                             where g.ID.Equals(from f in gradeList select gradeList.Max(s => s.ID))
                             select g;很正常,没报错。
      

  4.   

    这样貌似能快一点。你求出max还要多次比较。不如直接排序后取第一个。
    var query1 = (from g in gradeList orderby g._Grade select g).First();
      

  5.   

    这样貌似能快一点。你求出max还要多次比较。不如直接排序后取第一个。
    var query1 = (from g in gradeList orderby g._Grade select g).First();
      

  6.   

    Max()是返回一个值没错,但select是将所有结果封为一个结果集返回。就好象你在sql里select之后,即便只有一行,也是一个数据集~
      

  7.   

    我觉得这个和sql应该差不多,sql中where后面=的值一定是一个值,不能是一组值,那样会报错,
    所以我觉得和这个有关系,但是不知道为什么max返回的是一组值,却不是一个,可以方法命名说返回值
    是一个int的,大家可以看一下。
      

  8.   

    那就是说,我只能加一个First了,感觉很别扭
      

  9.   

    //按你意思写的
    var query2 = (from g in gradeList orderby g._Grade descending select g).First();//你的修改的
    var query1 = from g in gradeList
                 where g.ID.Equals ((from f in gradeList select gradeList.Max(s => s.ID)).First())
                 select g;
      

  10.   

    select 出的当然是集合。
    from f in gradeList select gradeList.Max(s => s.ID) // 你有7条,就会有7条一样的ID=7的记录
    (from f in gradeList select f.ID).max()  //先取出全部的ID,再 取最大的。 var query1 = from g in gradeList
                                 where g.ID.Equals((from f in gradeList select f.ID).Max())
                                 select g;
      

  11.   


    恩,思路比我的简单,其实我就是比较奇怪from f in gradeList select gradeList.Max(s => s.ID)
    这句为什么不返回一个值,一定要加一个first,呵呵,可能是有点轴了。
      

  12.   

    不好意思,来晚了,上午抱儿子去打防疫针去也~~
    var query1 = from g in gradeList
                 let maxId=gradeList.Max(g1=>g1.ID)
     where g.ID.Equals(maxId)
    select g;

    foreach(var q in query1)
    {
     Console.WriteLine(q);
    }
      

  13.   


    //把结果打印一下,你应该知道原因了吧...
     var query1 = from f in gradeList select gradeList.Max(s => s.ID);

    foreach(var q in query1)
    {
     Console.WriteLine(q);
            }
    /*
    结果:
    7
    7
    7
    7
    7
    7
    7*/