|
Программирование >> Программирование с использованием ajax
int firstNumber = 35; int secondNumber = 23; Console.WriteLine( Comparing {0} and {!}, result: {2} , Результат сравнения чисел firstNumber, secondNumber, Comparer.Default.Compare(firstNumber, secondNumber)); Здесь сначала используется статический член Comparer. Default для получения экземпляра класса Comparer, а затем - метод Compare () для сравнения первых двух строк и потом еще двух чисел. Результат получается следующий: Comparing First String and Second String, result: -1 Comparing 35 and 23, result: 1 Поскольку в алфавите буква F идет перед буквой S, считается, что F меньше, чем S, поэтому результат первого сравнения равен -1. Аналогично, число 35 является больше, чем 23 и потому результат в данном случае равен 1. Обратите внимание, что результаты не отражают величину разницы (т.е. на сколько меньше и больше один объект другого). В случае применения класса Comparer нужно обязательно использовать только такие типы, которые могут сравниваться. Попытка сравнить firstString с firstNumber, например, завершится генерацией исключения. Ниже перечислены моменты, касающиеся поведения этого класса, на которые стоит обратить внимание. □ Объекты, передаваемые Comparer. Compare () проверяются на предмет того, не поддерживают ли они интерфейс IComparable. Если поддерживают, тогда используется та реализация. □ Нулевые значения являются допустимыми и считаются меньшими любого другого объекта. □ Строки обрабатываются в соответствии с текущей культурой. При желании, чтобы строки обрабатывались в соответствии с какой-то другой культурой (или языком), экземпляр класса Comparer нужно создавать с помощью его собственного конструктора, который позволяет передавать объект System. Globalization.Cultureinfо, указывающий на применяемую культуру. а Строки обрабатываются с учетом регистра. При желании, чтобы они обрабатывались без учета регистра, нужно использовать класс CaselnsensitiveComparer, который во всем остальном работает совершенно таким же образом. Сортировка коллекций с использованием интерфейсов 1Сощ>агаЫе и IComparer Многие классы коллекций допускают возможность выполнения сортировки, либо с использованием стандартных операций сравнения между объектами, либо посредством специальных методов. Одним из примеров является класс коллекции ArrayList. Он содержит метод Sort (), который может применяться как без параметров, в случае чего используются стандартные операции сравнения, так и принимать в качестве параметра интерфейс IComparer, который он должен использовать для сравнения пар объектов. В случае класса коллекции ArrayList, заполняемого простыми типами вроде целых чисел или строк, стандартный метод сравнения вполне подходит. В случае же своих собственных классов нужно обязательно либо реализовать в определении класса интерфейс IComparable, либо создавать отдельный класс, поддерживающий интерфейс IComparer, и применять его для выполнения сравнений. Обратите внимание на то, что некоторые классы в пространстве имен System. Collection, включая CollectionBase, не предоставляют вообще никакого метода для сортировки. При желании реализовать сортировку в коллекции, унаследованной от какого-то из этих классов, придется прикладывать немного больше усилий и обеспечивать сортировку внутренней коллекции List самостоятельно. В следующем практическом занятии демонстрируется пример использования стандартного и нестандартного метода сравнения для сортировки списка. Сортировка списка 1. Создайте новое консольное приложение по имени ChllExOS и сохраните его в каталоге С: \BegVCSharp\Chapterll. 2. Добавьте новый класс Person и измените код в его файле следующим образом: namespace ChllExOS { class Person : IConparable public string Naxne; public int Age; public Person (string name, int age) { Name = name; Age = age; public int CompareTo (object obj) { if (obj is Person) { Person otherPerson = obj as Person; return this.Age - otherPerson.Age; else throw new ArgumentException ( Object to compare to is not a Person object. ) ; Сравюшаемый объект не является объектом Person 3. Добавьте еще один новый класс по имени PersonComparerName и измените код в его файле следующим образом: using System; using System. Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace ChllExOS public class PersonComparerName : IComparer public static IComparer Default = new PersonComparerName () ; public int Со1фаге(object х, object у) { if (х is Person && у is Person) { return Солфагег. Default. Солфаге ( ((Person)x).Name, ((Person)y).Name); else { throw new ArgumentException ( One or both objects to compare are not Person objects. ) ; Один или оба из сравниваемых объектов не являются объектами Person 4. Измените код в файле Program, cs, как показано ниже: using System; using System. Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace ChllExOS { class Program { static void Main(string[] args) { ArrayList list = new ArrayList () ; list.Add(new Person( Jim , 30)); list.Add(new Person( Bob , 25)); list.Add(new Person( Bert , 27)); list.Add(new Person( Ernie , 22)); Console.WriteLine( Unsorted people: ) ; Несортированный список людей for (int i = 0; i < list.Count; i++) { Console.WriteLine( {0) ({!)) , (list[i] as Person).Name, (list[i] as Person).Age); Console.WriteLine(); Console.WriteLine( People sorted with default comparer (by age) : ) ; Список людей, отсортированный (no возрасту) с помо]цью метода сравнения по умолчанию list.Sort О; for (int i = 0; i < list.Count; i++) { Console.WriteLine( {0} ({!)) , (list[i] as Person).Name, (list[i] as Person).Age); Console.WriteLine(); Console.WriteLine( People sorted with nondefault comparer (by name) : ) ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |