LINQ , minimalny element listy

LINQ , minimalny element listy
PO
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 7 lat
  • Postów:92
0

Witajcie, chciałem by za pomocą LINQ wybrać element listy, który ma najmniejszą ustalona wartość w swoim polu IssueYear.

Udało mi się za pomocą wyrażenia Lambda:
IEnumerable<Book> sb = list.OrderBy(s => s.getIssueYear()).Take(1); // sortujemy rosnąco i wybieramy 1 element
z LINQ zrobiłem coś takiego:

Kopiuj
 IEnumerable <Book> sb = (from Book in list
                             where Book.getIssueYear() == (list.Min().getIssueYear())
                             select Book).ToList();


            return sb;

Niestety wykonując test jednostkowy dla metody zawierającej powyższy kod otrzymuję błąd (z Lambda jest ok). Możecie pomóc znaleźć błąd? Wydaje mi się, że pomysł jest dobry - wybieram zawartość listy , której pole IsuueYear będzie równemu MIN z całej listy... Z góry dzięki.

SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:około rok
0

A jakby tak zrobić to po ludzku bez używania sortowania?

Jak wygląda metoda CompareTo w klasie Book ?

PO
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 7 lat
  • Postów:92
0

Nie posiadam metody CompareTo, założenie jest takie, że wszystkie metody muszę wykonać za pomocą LINQ , stąd sortowanie;)

SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:około rok
0

To list.Min() nie rzuca wyjątku?

Zrób list.Min(b => b.getIssueYear())) zamiast list.Min().getIssueYear().

I dlaczego używasz getIssueYear, jak możesz to zrobić za pomocą właściwości public int IssueYear {get; set;}

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:4 dni
  • Lokalizacja:Wrocław
2

Ech...
Jedno i drugie to jest LINQ. Tylko pierwsze ma normalną składnię z użyciem metod, a drugie z użyciem słów kluczowych.

No i jeśli chcemy jednego elementu, to używamy First lub FirstOrDefault, nie Take().

Co do pytania - dlaczego próbujesz zastąpić OrderBy przy pomocy Where?

Kopiuj
(from b in list orderby b.IssueYear select b).SingleOrDefault()

I przestań pisać w Javie, skoro piszesz w C#. getIssueYear to nie jest poprawna konwencja.

PO
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 7 lat
  • Postów:92
0

Postaram się popracować nad konwencją, cały czas przyzwyczajenia z Javy ;) Pozdrawiam, dzięki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.