Помните, что в SWT необходимо явно расположить любые ресурсы, которые Вы создаете, когда Вы сделаны с ними. Это включает виджеты, шрифты, цвета, изображения, дисплеи, принтеры и GCs. Если Вы не расположите эти ресурсы, в конечном счете Ваше приложение достигнет предела ресурса Вашей операционной системы, и приложение прекратит работать.
MyList.Sort имеет один параметр - функцию, которая отвечает за сравнение элементов, поэтому список может быть отсортировано в соответствии с ним.
Далее: делегат (x, y) определяет саму функцию, которая принимает два параметра типа KeyValuePair [String, Int32] .
Содержимое в скобках {...} - это фактическая логика сравнения:
return x.Value.CompareTo(y.Value);
, которая сравнивает 2 целых значения в соответствии с этим определением .
Таким образом, ваш список будет отсортирован на основе значений этих целых чисел в порядке возрастания.
В C # 3.5 я бы переписал его так:
mylist.Sort((x,y) => x.Value.CompareTo(y.Value));
Это функция сортировки, вызываемая в списке, и в нее передается делегат, который вызывается функцией Sort () для фактического сравнения двух элементов.
Страница MSDN о функции http://msdn.microsoft.com/en-us/library/0e743hdt.aspx
Подумайте об этом иначе. Допустим, у вас есть метод, который выглядел следующим образом:
public int MyComparisonMethod(KeyValuePair<string, int> x, KeyValuePair<string,int> y)
{
return x.Value.CompareTo(y.Value);
}
Он в основном принимает два значения и сравнивает их. Он возвращает -1, 0 или 1 в зависимости от того, меньше ли x, равно или больше y соответственно.
Теперь, скрытно, List.Sort использовал алгоритм быстрой сортировки. Все, что вам нужно понять, это то, что он постоянно сравнивает различные элементы в вашем списке друг с другом. Как узнать, больше ли значение a, меньше или равно значению b? Он вызывает этот метод и на основании этого знает. Имеет смысл?
Итак, идея заключается в том, что вы предоставляете механизм для сравнения двух значений в вашем списке, и List.Sort использует его для сравнений, необходимых для сортировки.
Просто FYI,
Обычно используется в случае, если вам нужно отсортировать список настраиваемых классов.
Например,
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);});
Это неявно, но, возможно, вам следовало упомянуть объявление вашего "myList". позвольте мне написать это для вас.
var myList=new List<KeyValuePair<string, int>>();
Теперь это означает, что каждый элемент в этом списке является экземпляром KeyValuePair [string, int].
Теперь перейдем к вашему вопросу.
Одна из перегрузок of Sort принимает делегат Comparison, который принимает два элемента коллекции и возвращает целое число.
public delegate int Comparison<T>(T x, T y)
По сути, вы создаете анонимный делегат, который сравнивает два элемента (в вашем случае вы сортируете по «Value», вы даже можете сортировать по «Key»), используя метод «CompareTo» IComparable (строка и int реализует этот интерфейс).
IComparable.CompareTo возвращает целое число (которое используется методом Sort для упорядочивания элементов в вашем списке), указывающее, что lhs меньше (-1), больше (1) или равно ( 0) rhs.
К сведению: если вы работаете над C # 3.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);
}
);