Return 使用 Linq 的自定义列表 class

Return list of custom class using Linq

我有一个 class Author.cs 作为:

public class Author  
{  
   public Author()  
   { }  

   public int _AuthorID { get; set; }  
   public string _AuthorName { get; set; }  
   public List<Paper> _Papers { get; set; }  
}

和另一个 class Paper.cs 作为:

public class Paper  
{  
   public Paper()  
   { }  

   public int _PaperID { get; set; }
   public List<int> _CoAuthors { get; set; }
   public int _VenueID { get; set; }
   public int _PaperCategory { get; set; }
   public int _Year { get; set; }
}  

我想在 Author.cs class 中有一个方法,其中 returns 是给定年份的作者和给定年份之间的作者。

我试过如下:

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

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

方法 GetPaperYear() 尚未定义,但它打算在 class Author.cs 中定义这样的方法以实现目标,这就是为什么在此处显示为虚拟方法。

同样,我想要这样的方法:

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

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

如何使用 Linq 实现此目的?

比您已经使用的更深入地使用 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()

如果你想在 Author class 中有单独的方法,就像你在问题中问的那样,它可能看起来像:

public class Author
{
    public Author()
    { }

    public int _AuthorID { get; set; }
    public string _AuthorName { get; set; }
    public List<Paper> _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<Author> GetAuthorsByYear(List<Author> _fullList, int _year)
{
    return _fullList.Where(_author => _author.HasPapersForYear(_year)).ToList();
}

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

还有关于 Venue 和 CoAuthors 的部分

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

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

此代码肯定可以重构。