2016-06-13 19 views
-3

Ich habe eine Klasse Author.cs wie:Return Liste der benutzerdefinierten Klasse mit Linq

public class Author 
{ 
    public Author() 
    { } 

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

und eine andere Klasse Paper.cs wie:

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

ich eine Methode in Author.cs Klasse haben wollen, die Autoren zurück für gegebenes Jahr und Autor zwischen den angegebenen Jahren.

Ich habe versucht, wie folgend:

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

Verfahren GetPaperYear() noch nicht definiert, aber es beabsichtigt ist, ein solches Verfahren in der Klasse zu definieren Author.cs das Ziel zu erreichen, deshalb als Dummy hier gezeigt ist.

Ebenso möchte ich Methoden haben wie:

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 
} 

Wie dies mit Linq erreichen?

+2

Das ist schon Linq, was brauchst du mehr? –

+0

Ich verstehe es wirklich nicht, was ist das Problem mit Ihrem Ansatz? –

+1

Seine Linq aber wie ich auch oben erwähnt, ist die Methode 'GetPaperYear()' noch nicht definiert in 'Author.cs' Klasse. '_Year' ist eine Eigenschaft der' Paper.cs' Klasse, also wenn es eine Methode wie diese in 'Author.cs' Klasse gibt, dann wird Linq ie im obigen Code gezeigt nützlich sein – maliks

Antwort

0

Wenn Sie separate Methode in der Author Klasse haben wollen, wie Sie in der Frage gestellt, es könnte wie folgt aussehen:

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

und alten Methoden werden geändert:

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

auch über die Teil von Venue und 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; 
    }  

Dieser Code könnte sicher refaktoriert werden.

+0

@Taufel Ich verstehe nicht was Du meinst wirklich (wegen des Mangels an Informationen) und wie es mit deiner anfänglichen Frage zusammenhängt. – user2216

+0

@Taufel warum aktualisierst du die Frage nicht mit mehr Details? – user2216

+0

Ich verstehe wirklich nicht, was Sie meinen, weil 'HasVenuesForYear' für mich jetzt dasselbe wie' HasPapersForYear' ist, weil 'Paper' Klasse Int32 Wert für' VenueID' hat und jedes Papier nicht null VenueId hat. – user2216

0

Verwenden Linq ein wenig tiefer, als Sie bereits verwendet und Ihre return-Anweisung ändern:

In GetAuthorsByYear() Methode:

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

In GetAuthorsBetweenYears() Methode:

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

Verfahren GetPaperYear() ist nicht mehr erforderlich.

+0

Es ist die falsche Lösung. Schau dir die zweite Methode an. Wenn Autor hat zwei Papiere - eine für 2000 Jahre, die zweite - 2020. Wenn StartJahr 2010 ist, EndeJahr ist 2015, wird dieser Autor zurückgegeben, aber das ist falsch.Er hat mindestens ein Buch, das Jahr mehr als 2010 hat und mindestens ein Buch, das Jahr weniger als 2015 hat. – user2216

+0

Ich möchte dich hier ernst nehmen, aber unfähig zu verstehen, auf was du zeigst? – maliks

+0

Zuerst - die zweite Methode kann sogar nicht kompiliert werden. – user2216

Verwandte Themen