2009-11-20 14 views
8

Właśnie usunąłem ten fragment ze strony internetowej i okazało się, że jest to dokładnie rozwiązanie, którego potrzebowałem do mojego konkretnego problemu.OK, działało. co to właściwie jest?

Nie mam pojęcia, co to jest (w szczególności część przekazana i część powrotna), a źródło tego nie wyjaśnia.

Nadzieja, że ​​mogę oświecić mnie.

myList.Sort( delegate(KeyValuePair<String, Int32> x, KeyValuePair<String, Int32> y) 
       { 
       return x.Value.CompareTo(y.Value); 
       } 
      ); 
+8

+1 za to, że chcesz zrozumieć, co robisz, zamiast przechodzić do następnego znalezionego fragmentu. –

+0

Nie zapomnij przyjąć odpowiedzi. –

Odpowiedz

11

MyList.Sort ma jeden parametr - funkcję, która jest odpowiedzialna za porównywanie przedmiotów, więc lista może być sortowana accoding do niego.

Dalej: pełnomocnik (x, y) określa funkcję, która sama ma dwa parametry typu KeyValuePair [String Int32].

Zawartość się między znakami {}, ... jest rzeczywistą logiczny comparisson:

return x.Value.CompareTo(y.Value); 

2, który porównuje wartości całkowitych według this definition.

W ten sposób twoja lista zostanie posortowana na podstawie wartości tych liczb całkowitych w kolejnej kolejności.


z C# 3.5 Chciałbym przerobić go tak:

mylist.Sort((x,y) => x.Value.CompareTo(y.Value)); 
+0

Czy kod C# 3.0 może zostać skrócony? – Chris

+0

Tak. Zaktualizowałem odpowiedź. –

+0

Tak więc pod maską zakładam, że coś takiego się dzieje: dla każdego keyvaluepair z tej listy, porównaj pozycję "wartość" w bieżącym keyvaluepair z pozycją "value" w następnym keyvaluepair. ten, który jest większy, umieszcza jedno gniazdo wyżej niż drugie. -am zamykam? – fieldingmellish

0
myList.Sort //Sort using a your own compare function 
    (
    // declare the compare function, returns a int, and receives two items 
    delegate(KeyValuePair<String, Int32> x, KeyValuePair<String, Int32> y) 
    { 
     // returns a int indicating whether the items are "equal" - equal being what is implemented it the appropriate compare function. 
     return x.Value.CompareTo(y.Value); 
    } 
); 
+2

Wierzę, że faktycznie zwraca int, gdzie 0 jest równe, mniej niż 0 oznacza x y – Davy8

+2

Zwraca INT, NIE BOOLEAN! –

0

Pomyśl o tym w ten sposób. Załóżmy, że masz metodę, która wyglądała tak:

public int MyComparisonMethod(KeyValuePair<string, int> x, KeyValuePair<string,int> y) 
{ 
    return x.Value.CompareTo(y.Value); 
} 

Zasadniczo przyjmuje dwie wartości i porównuje je. Zwraca wartość -1, 0 lub 1 w zależności od tego, czy x jest mniejsze, równe lub większe niż y.

Teraz pod listami List.Sort użył algorytmu szybkiego sortowania. Wszystko, co musisz zrozumieć, to to, że porównuje różne elementy ze swojej listy ze sobą nawzajem. Skąd wiadomo, że wartość a jest większa niż, mniejsza lub równa wartości b? Nazywa tę metodę i na tej podstawie wie. Ma sens?

Chodzi o to, że zapewnisz mechanizm porównywania dwóch wartości z listy, a List.Sort używa tego do porównań, których potrzebuje do sortowania.

0

Po prostu FYI,

ten jest powszechnie stosowany w przypadku trzeba posortować listę klas niestandardowych.

Dla np.

class Student 
{ 
    int rollID; 
    string name; 
} 

List<Student> students = new List<Student>(); 

... 

students.Sort(delegate(Student x, Student y) { return x.rollID.CompareTo(y.rollID);}); 
0

Jest to domyślne, ale być może powinieneś wspomnieć o deklaracji swojej "myList". Pozwól mi to dla ciebie napisać.

var myList=new List<KeyValuePair<string, int>>(); 

Co oznacza, że ​​każda pozycja na tej liście jest instancją klasy KeyValuePair [string, int].

Teraz przychodzę na twoje pytanie.

Jedno z przeciążeń metody Sort akceptuje delegata "Porównanie", który pobiera dwie pozycje z kolekcji i zwraca liczbę całkowitą.

public delegate int Comparison<T>(T x, T y) 

Zasadniczo, co robisz jest stworzenie anonimowego delegata, który porównuje dwa przedmioty (w przypadku, jesteś sortowania na „wartość”, można nawet rodzaj na „Key”) za pomocą „CompareTo” metoda IComparable (string i int implementują ten interfejs).

IComparable.CompareTo zwraca liczbę całkowitą (używaną przez Sortowanie do uporządkowania pozycji na liście), stwierdzając, że lhs jest mniejsze niż (-1), greather niż (1) lub jest równe (0) rhs.

FYI: Jeśli pracujesz nad C# 3.0, nie potrzebujesz nawet anonimowego delegata. Można użyć wyrażenia lambda zamiast (jest skrótem zdefiniowanie anonimowych delegata, more?)

np

myList.Sort((x, y) => x.Value.CompareTo(y.Value)); 
//Sort over Value 

myList.Sort((x, y) => x.Key.CompareTo(y.Key)); 
//Sort over key 

nadzieję, że wyjaśnienie jest bardzo pomocna.