Программирование >>  Программирование с использованием ajax 

1 ... 101 102 103 [ 104 ] 105 106 107 ... 396


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) : ) ;



1 ... 101 102 103 [ 104 ] 105 106 107 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика