2009-03-18 14 views
5

Czy jest dostępna wbudowana obsługa języka C# do sortowania według indeksu?Czy istnieje obsługa języka C# dla sortowania opartego na indeksie?

Więcej szczegółów:
Mam kilka zestawów danych przechowywanych w indywidualnych ogólnych listach podwójnych. Są to listy o równej długości i zawierające odpowiednie elementy danych, ale te listy pojawiają się i znikają dynamicznie, więc nie mogę po prostu przechowywać odpowiednich elementów danych w klasie lub strukturze czysto. (Mam również do czynienia z niektórymi problemami ze starszymi wersjami.)

Muszę mieć możliwość sortowania tych kluczy z dowolnego zestawu danych.

Moją myślą o najlepszym sposobie zrobienia tego jest dodanie jednego poziomu pośredniego i użycie sortowania opartego na indeksie. Tego rodzaju używano od lat.

Szybkie definicja indeksu porządek oparta:
make „index”, szereg kolejnych liczb całkowitych taką samą długość jak list, to algorytm sortowania sortuje listę liczb całkowitych, tak aby anylist[index[N]] daje n-ty element anylist w posortowanej kolejności. Same listy nigdy nie są ponownie uporządkowane.

Czy jest dostępna wbudowana obsługa języka C# do sortowania według indeksu? Nie mogłem go znaleźć ... wszystko, co znalazłem, zmienia kolejność samej kolekcji. Przypuszczam, że istnieje wsparcie, ale nie znalazłem jeszcze odpowiedniego miejsca.

Używam C# .NET 3.5, pod Windows.

Odpowiedz

12

Po skonfigurowaniu tablicę indeksu można sortować je przy użyciu niestandardowego Comparison<T> który porównuje wartości w odpowiednich elementów w tablicy danych:

Array.Sort<int>(index, (a,b) => anylist[a].CompareTo(anylist[b])); 
+0

Wow! To jest niesamowite. Dokładnie to, czego potrzebowałem w jednej linii. Zakładam, że to musi używać Linq. Nie studiowałem tego, więc nie wiem jak to działa ... zgaduję, że muszę się trochę uczyć. Dzięki! –

+1

Nie, nie ma LINQ, ale istnieje wyrażenie lambda, które jest powszechnie używane z LINQ. – Guffa

+2

A jeśli twoja macierz nie jest porównywalna, jej tylko 1 linia: Porównuje comparer = Porównywarka .Default; Array.Sort (indeks, (a, b) => comparer.Compare (array [a], array [b])); –

0

Poniższy kod achievs indeksowany sortowania. Zwróć uwagę na wywołanie ToArray() w celu sklonowania tablicy danych. Jeśli zostanie pominięty, tablica danych również zostanie posortowana.

static void Main(String[] args) 
{ 
    Int32[] data = new Int32[] { -6, 6, 5, 4, 1, 2, 3, 0, -1, -2, -3, -4, -5 }; 

    Int32[] indices = Enumerable.Range(0, data.Length).ToArray(); 

    Array.Sort(data.ToArray(), indices); 

    foreach (Int32 index in indices) 
    { 
     Console.Write(String.Format("{0} ", data[index])); 
    } 

    Console.ReadLine(); 
} 

Wyjście jest tak samo widoczne.

-6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 
+0

Nie, to nie jest sortowanie według indeksu, mimo że część wyniku jest taka sama jak w przypadku sortowania według indeksu. – Guffa

+0

Pozycje w indeksach zostały zmienione tak, że dane [indeksy [i]] dla i w 0 do data.length dają elementy danych w posortowanej kolejności. Oto co robi sortowanie według indeksu. –

+0

Przyznaję, że sposób, w jaki jest to zrobione, nie jest zbyt sprytny, ponieważ indeksy są sortowane przez sortowanie kopii danych. Wynik jest taki sam, ale kosztowny w porównaniu do rozwiązania, jeśli elementy danych są duże. –

Powiązane problemy