Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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# 使用Linq返回自定义类的列表_C#_Linq_List_Return_User Defined Types - Fatal编程技术网

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

C# 使用Linq返回自定义类的列表,c#,linq,list,return,user-defined-types,C#,Linq,List,Return,User Defined Types,我有一个类Author.cs为: public class Author { public Author() { } public int _AuthorID { get; set; } public string _AuthorName { get; set; } public List<Paper> _Papers { get; set; } } public class Paper { public P

我有一个类
Author.cs
为:

public class Author  
{  
   public Author()  
   { }  

   public int _AuthorID { get; set; }  
   public string _AuthorName { get; set; }  
   public List<Paper> _Papers { get; set; }  
}
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
类中有一个方法,它返回给定年份的作者和给定年份之间的作者

我尝试了以下方法:

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();
}  

如何使用Linq实现这一点?

使用Linq比您已经使用的更深入一点,并将返回语句更改为:

GetAuthorsByYear()
方法中:

return _fullList.Where(_author => _author._Papers.Any(y => y._Year == _year)).ToList();  
return _fullList.Where(_author => _author._Papers.Any(y => y._Year >= _startYear && y._Year <= _endYear))).ToList();
GetAuthorsBetweenYears()方法中:

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

return\u fullList.Where(\u author=>\u author.\u Papers.Any(y=>y.\u Year>=\u startYear&&y.\u Year如果您想在
author
类中使用单独的方法,如您在问题中所问,它可能如下:

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);
    }
}
公共类作者
{
公共作者()
{ }
公共整数{get;set;}
公共字符串_AuthorName{get;set;}
公共列表{get;set;}
公共图书馆有文件年鉴(国际年)
{
返回_Papers.Any(_Papers=>_Papers._Year==年份);
}
公共图书馆有文件可供查阅(起始日期、结束日期)
{
返回论文。任何(\u论文=>\u论文。\u年>=开始日期和日期论文。\u年\u作者。HasPapersFryear(\u年)).ToList();
}
public List getAuthorsBetweenyear(List _fullList,int _startYear,int _endYear)
{
返回_fullList.Where(_author=>_author.hasPapersForyear(_startYear,_endYear)).ToList();
} 
还有关于场地和合著者的部分

    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;
    }       
公共列表GetCoAuthorsByYear(国际年)
{
var coAuthors=新列表();
foreach(var票据在_票据中,其中(_票据=>_票据._年==_年))
{
合著者.AddRange(论文合著者);
}
返回合著者;
}
公开列表GetCoAuthorsBetweenyear(国际起始年,国际结束年)
{
var coAuthors=新列表();
foreach(var票据在票据中,其中((票据=>>票据年>==票据年期和票据年期和票据年期===票据年期))
{
场馆。添加(纸质版);
}
返回场馆;
}
年与年之间的公共列表GetVenues(整数开始年,整数结束年)
{
var=newlist();

foreach(var paper in_Papers.Where(_Papers=>_Papers._Year>=_startYear&&&u Papers._Year._Year那已经是Linq了,你还需要什么?我真的不明白,你的方法有什么问题?它是Linq,但正如我上面提到的,方法
GetPaperYear()
Author.cs
类中尚未定义。
\u Year
Paper.cs
类的一个属性,因此如果在
Author.cs
类中有类似的方法,那么如果我正确理解您可以更改
GetAuthorsByYear
方法:
return\u fullList.Wh,则上面代码中显示的Linq将是有用的ere(_author=>_author._Papers.Any(y=>y._Year==\u Year)).ToList();
当然,第二年也要用同样的方式更改。你可能想去掉下划线,它们没有帮助。@Taufel我不明白你的真正意思(因为缺乏信息)以及它与你最初的问题的关系。@Taufel你为什么不用更多的细节来更新这个问题?我真的不明白你的意思,因为
HasVenuesForYear
对我来说,现在它与
HasPapersForYear
相同,因为
Paper
类对
VenueID
有Int32值,而每篇论文都没有null VenueId。我已经用更多细节更新了问题,请相应地更新您的答案,并让我知道您是否也在更新您的答案?@user2216——如果我们想要像
GetPapersBetween Years()这样的方法
在课堂上
Author.cs
那么我们如何编写这个方法?这是错误的解决方案。看看第二种方法。如果作者有两篇论文,一篇是2000年,第二篇是2020年。如果开始时间是2010年,结束时间是2015年,这个作者将被返回,但这是不正确的。他至少有一本书的年份超过2010年,至少有一本这本书的年份比2015年还短。我很想让你们认真地看一看,但无法理解你们所指的是什么?首先,第二种方法甚至无法编译。但正如你们上面给出的例子,作者的论文不能超过开始日期和结束日期,论文必须介于开始日期和结束日期之间,而且它不是一个开放式的或者用户选择使用任何纸张或任何开始日期或结束日期的值。请阅读我对此答案的第一条评论,并再次查看其中的
GetAuthorsBetweenYears()
方法。我给出了一个示例,说明该方法不正确,并且该方法不应返回author,但返回了author。