2013-12-23 38 views
0
public class Person 
{ 
    public int Id {get;set;} 
    public int PersonId {get;set;} 
    public string University {get;set;} 
    public string Department {get;set;} 
    public DateTime GraduatedDate {get;set;} 
} 

List<Person> list = new List<Person>(); 
list.Add(new Person { 1, 1, "Shota Rustavelli University", "Computer Science BS", "10.12.2005" }); 
list.Add(new Person { 2, 1, "Shota Rustavelli University", "Computer Science MS", "10.12.2005" }); 
list.Add(new Person { 3, 2, "Tblisi State University", "Mathematics BS", "10.12.2004" }); 
list.Add(new Person { 4, 3, "Shota Rustavelli University", "Economics BS", "10.12.2006" }); 
list.Add(new Person { 5, 3, "Tblisi State University", "Economics MS", "10.12.2006" }); 
list.Add(new Person { 6, 1, "Georgian Technical University", "Mathemetics Phd", "10.12.2009" }); 



foreach(var item in (list.GroupBy(m=> new{m.PersonId,m.University,m.Department})).Max(m=>m.GraduatedDate)) 
{ 
    item.PersonId 
    item.University 
    item.Department 
} 

我如何获得通过PERSONID使用下面structure.I根据去年graduted大学和部门根据名单里面选择最多的日期已尝试使用LINQ的GroupBy和Max,但我得到的错误。通过用户ID

回答

2

Max(m=>m.GraduatedDate)只会为您带来:中GraduatedDate最大值在集合。在你的情况下,它不能编译,因为你把它应用到itemsthat集合没有GraduatedDate财产。

为了让每个人最后毕业时,你可以使用下面的LINQ查询:

var results = 
     list 
     .GroupBy(m => m.PersonId) 
     .Select(g => new { 
      PersonId = g.Key, 
      LastGraduation = g.OrderByDescending(p => p.GraduatedDate).First() 
     }); 

结果可随后被显示成这样,例如:

foreach(var r in results){ 
     Console.WriteLine("{0}, {1}, {2}", 
      r.PersonId, 
      r.LastGraduation.University, 
      r.LastGraduation.Department); 
    } 

这里是一个ideone片断显示了这种运行的版本:http://ideone.com/em4Ygq

请注意,我改变了GraduatedDatestring,以更好地匹配您初始化列表的方式。我应该声明为DateTime并相应地进行初始化。

+0

索里我的问题仍然 – Bombula

1

虽然你可以使用的GroupBy和Max返回最新的个人条目,它更容易和经常更快地使用MoreLINQ的MaxBy操作者具有最大的谓词返回元素:

IEnumerable<Person> personEntries=list.GroupBy(p => p.PersonId) 
      .Select(g => g.MaxBy(p => p.GraduatedDate)); 

您可以添加MoreLINQ图书馆为single NuGet package或者您也可以只添加你想要的运营商的源代码,如MaxBy

的原因,这些运营商比的GroupBy和排序更快的是,MaxBy/MinBy运营商不列表的元素进行排序,但SIMPL y遍历所有项目,仅保留对遇到的最大/最小项目的引用。这比分类快得多。

在PLINQ场景MaxBy/MinBy是作为排序将引入锁和同步,可以使你的PLINQ查询运行速度较慢的串行版本是必不可少的。