2016-06-13 17 views
-3

У меня есть класс Author.cs как:Return список заказного класса с помощью Linq

public class Author 
{ 
    public Author() 
    { } 

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

и другой класс 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 класса, который возвращает авторов для учитывая Год и автора между этими Годами.

Я попытался следующие:

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() еще не определена, но она предназначена для определения такого метода в классе 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?

+2

Это уже Linq, что еще вам нужно? –

+0

Я действительно не понимаю, в чем проблема с вашим подходом? –

+1

Его Linq, но, как я уже упоминал выше, метод 'GetPaperYear()' еще не определен в классе 'Author.cs'. '_Year' является свойством класса' Paper.cs', поэтому, если в классе 'Author.cs' есть такой метод, то Linq, показанный в приведенном выше коде, будет полезен – maliks

ответ

0

Если вы хотите иметь отдельный метод в 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); 
    } 
} 

И старые методы меняются:

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

также о часть Место проведения и 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; 
    }  

Этот код может быть реорганизовано конечно.

+0

@Taufel Я не понимаю, что вы действительно имеете в виду (из-за отсутствия информации) и как это связано с вашим первоначальным вопросом. – user2216

+0

@Taufel, почему бы вам просто не обновить вопрос более подробно? – user2216

+0

Я действительно не понимаю, что вы имеете в виду, потому что «HasVenuesForYear» для меня теперь это то же самое, что и «HasPapersForYear», потому что класс «Бумага» имеет значение Int32 для 'VenueID', и каждая статья не имеет значения null VenueId. – user2216

0

Использование Linq немного глубже, чем вы уже использовали и изменить обратное заявление как:

В 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() является больше не требуется.

+0

Это неправильное решение. Посмотрите на второй метод. Если у автора две статьи - одна за 2000 год, вторая - 2020. Если startYear - 2010, endYear - 2015, этот автор будет возвращен, но это неверно.У него есть, по крайней мере, одна книга, в которой больше года, чем в 2010 году, и, по крайней мере, одна книга, в которой меньше года. – user2216

+0

Я хотел бы рассказать вам серьезно, но не мог понять, на что вы указываете? – maliks

+0

Сначала - второй метод даже не может быть скомпилирован. – user2216

Смежные вопросы