2010-05-26 5 views
9

Miałem listę krotek, gdzie każda krotka składa się z dwóch liczb całkowitych i chciałem sortować według drugiej liczby całkowitej. Po patrząc w pomocy Pythona Mam ten:Jak sortować listę przez 2 element krotki w python i C#

sorted(myList, key=lambda x: x[1]) 

co jest dobre. Moje pytanie brzmi, czy istnieje równie lapidarny sposób robienia tego w języku C# (język, w którym muszę pracować)? Znam oczywistą odpowiedź związaną z tworzeniem klas i określeniem anonimowego delegata dla całego kroku porównania, ale być może istnieje również sposób zorientowany na linq. Z góry dziękuję za wszelkie sugestie.

Odpowiedz

6

Zakładając, że lista krotek ma typ IEnumerable<Tuple<int, int>> (sekwencja krotek reprezentowane za pomocą Tuple<..> klasy z .NET 4.0), można napisać następujący wykorzystaniem metod rozszerzeń LINQ:

var result = myList.OrderBy(k => k.Item2); 

w kodzie k.Item2 zwraca drugi składnik krotki - w języku C# jest to właściwość (ponieważ dostęp do elementu według indeksu nie byłby ogólnie bezpieczny dla typu). W przeciwnym razie myślę, że kod jest dość zwięzły (również dzięki ładnej notacji funkcji lambda).

Korzystanie składni zapytań LINQ, można napisać to tak (choć pierwsza wersja jest IMHO bardziej czytelne i zdecydowanie bardziej zwięzły):

var result = from k in myList orderby k.Item2 select k; 
+0

fajne dzięki. Nie mogę się doczekać aktualizacji do 4.0 wkrótce –

+0

@Damian: To też działałoby w C# 3.0, ale musiałbyś zaimplementować własną 'Tuple ' (jest to po prostu prosta klasa z dwoma właściwościami typów ogólnych "T1 Item1 {get; set;}' and 'T 2 Item2 {get; zestaw; } ' –

14

Innym sposobem, aby to zrobić w Pythonie jest to

from operator import itemgetter 
sorted(myList, key=itemgetter(1)) 
+0

Wiwaty Nie wiedziałem o itemgetter –

Powiązane problemy