2010-03-29 14 views

Odpowiedz

8

Zakładam, że szukasz akcesora, który zwróci N-ty element nieuporządkowanej kolekcji, wykonując sortowanie częściowe w kolekcji. Jest to przydatne, gdy masz bardzo dużą kolekcję i interesuje Cię jeden z pierwszych elementów oparty na pewnym predyktorze zamówień.

Według mojej wiedzy, rozszerzenia .NET BCL lub LINQ nie oferują odpowiednika. Wszystkie metody sortowania (w tym Enumerable.OrderBy) umożliwiają pełne uporządkowanie kolekcji.

Jeśli potrzebujesz wydajnej wersji Nth, musisz wykonać własną metodę rozszerzenia na IEnumerable, aby to zrobić. Jeśli masz zamiar przetasować swój, możesz zajrzeć do Quick Select algorithm, który ma wydajność O (n).

Jeśli wersja brute-force jest wystarczająca, można użyć LINQ:

var someCollection = new []{ 5, 2, 8, 9, 0, 1, 3, 12, 4 }; 

var fifthItem = someCollection.NthItem(5); 

public static class NthExtensions 
{ 
    public static T NthItem(this IEnumerable<T> coll, int n) 
    { 
     return coll.OrderBy(x => x).Skip(n - 1).First(); 
    } 
} 
1

Nie ma bezpośredniego odpowiednika. Potencjalnie możesz użyć LINQ's OrderBy i Take/Skip, aby osiągnąć te same cele na dowolnych IEnumerable, ale cała kolekcja zostanie posortowana w tym procesie.

+0

Zastanawiam się, czy w przypadku, gdy 'OrderBy' zostanie zaimplementowany funkcjonalnie (np. Poprzez sortowanie scalone), kombinacja' take/skip' oraz * lazy evaluation * w rzeczywistości nie wykona ** częściowego ** sortowania zgodnie z prośbą. 'head (sort list))' w Haskell - na przykład - jest poprawnym podejściem O (n) do znalezienia minimum listy. Jakieś wskazówki? – Dario

+0

@Dario: Teoretycznie może ~, ale obecna implementacja tego nie robi. –

+0

Byłoby jednak zabawnie :) – Dario