使用Linq返回自定义类的列表

我有一个Author.cs类:

 public class Author { public Author() { } public int _AuthorID { get; set; } public string _AuthorName { get; set; } public List _Papers { get; set; } } 

另一类Paper.cs

 public class Paper { public Paper() { } public int _PaperID { get; set; } public List _CoAuthors { get; set; } public int _VenueID { get; set; } public int _PaperCategory { get; set; } public int _Year { get; set; } } 

我希望在Author.cs类中有一个方法,它返回给定Year的作者和给定Year之间的作者。

我尝试如下:

 public List GetAuthorsByYear(List _fullList, int _year) { return _fullList.Where(_author => _author.GetPaperYear() == _year).ToList(); } public List GetAuthorsBetweenYears(List _fullList, int _startYear, int _endYear) { return _fullList.Where(_author => _author.GetPaperYear() >= _startYear && _author.GetPaperYear() <= _endYear).ToList(); } 

方法GetPaperYear()尚未定义,但它旨在在类Author.cs定义这样的方法,以实现这里为虚拟所示的目标。

同样,我想要的方法如下:

 public List GetCoAuthorsByYear(int _year) { // How to return list of coauthors by year } public List GetCoAuthorsBetweenYears(int _startYear, int _endYear) { // How to return list of coauthors between years } public List GetVenuesByYear(int _year) { // How to return list of venues by year } public List GetVenuesBetweenYears(int _startYear, int _endYear) { // How to return list of venues between years } 

如何使用Linq实现这一目标?

如果你想在问题类中使用单独的方法,就像你在问题中提到的那样,它可能看起来像:

 public class Author { public Author() { } public int _AuthorID { get; set; } public string _AuthorName { get; set; } public List _Papers { get; set; } public bool HasPapersForYear(int year) { return _Papers.Any(_paper => _paper._Year == year); } public bool HasPapersForYears(int startYear, int endYear) { return _Papers.Any(_paper => _paper._Year >= startYear && _paper._Year <= endYear); } } 

旧的方法改变了:

 public List GetAuthorsByYear(List _fullList, int _year) { return _fullList.Where(_author => _author.HasPapersForYear(_year)).ToList(); } public List GetAuthorsBetweenYears(List _fullList, int _startYear, int _endYear) { return _fullList.Where(_author => _author.HasPapersForYears(_startYear,_endYear)).ToList(); } 

还有Venue和CoAuthors的部分内容

  public List GetCoAuthorsByYear(int _year) { var coAuthors = new List(); foreach(var paper in _Papers.Where(_paper => _paper._Year == _year)) { coAuthors.AddRange(paper._CoAuthors); } return coAuthors; } public List GetCoAuthorsBetweenYears(int _startYear, int _endYear) { var coAuthors = new List(); foreach(var paper in _Papers.Where(_paper => _paper._Year >= _startYear && _paper._Year <= _endYear)) { coAuthors.AddRange(paper._CoAuthors); } return coAuthors; } public List GetVenuesByYear(int _year) { var venues = new List(); foreach(var paper in _Papers.Where(_paper => _paper._Year == _year)) { venues.Add(paper._VenueID); } return venues; } public List GetVenuesBetweenYears(int _startYear, int _endYear) { var venues = new List(); foreach(var paper in _Papers.Where(_paper => _paper._Year >= _startYear && _paper._Year <= _endYear)) { venues.Add(paper._VenueID); } return venues; } 

这段代码可以肯定地重构。

使用Linq比您已经使用的更深,并将您的return语句更改为:

GetAuthorsByYear()方法中:

 return _fullList.Where(_author => _author._Papers.Any(y => y._Year == _year)).ToList(); 

GetAuthorsBetweenYears()方法中:

 return _fullList.Where(_author => _author._Papers.Any(y => y._Year >= _startYear && y._Year <= _endYear))).ToList(); 

不再需要GetPaperYear()方法。