Kniga-Online.club
» » » » Герберт Шилдт - C# 4.0: полное руководство

Герберт Шилдт - C# 4.0: полное руководство

Читать бесплатно Герберт Шилдт - C# 4.0: полное руководство. Жанр: Программирование издательство -, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

  public int Compare(object x, object y) {

    Inventory a, b;

    a = (Inventory)x;

    b = (Inventory)y;

    return string.Compare(a.name, b.name, StringComparison.Ordinal);

  }

}

class Inventory {

  public string name;

  double cost;

  int onhand;

  public Inventory(string n, double c, int h) {

    name = n;

    cost = c;

    onhand = h;

  }

  public override string ToString() {

    return

    String.Format("{0,-10} Цена: {1,6:С} В наличии: {2}",

name, cost, onhand);

  }

}

class IComparerDemo {

  static void Main() {

    CompInv comp = new CompInv();

    ArrayList inv = new ArrayList();

    // Добавить элементы в список.

    inv.Add(new Inventory("Кусачки", 5.95, 3));

    inv.Add(new Inventory("Отвертки", 8.29, 2));

    inv.Add(new Inventory("Молотки", 3.50, 4));

    inv.Add(new Inventory("Дрели", 19.88, 8));

    Console.WriteLine("Перечень товарных запасов до сортировки:");

    foreach (Inventory i in inv) {

      Console.WriteLine("    " + i);

    }

    Console.WriteLine();

    // Отсортировать список, используя интерфейс IComparer.

    inv.Sort(comp);

    Console.WriteLine("Перечень товарных запасов после сортировки:");

    foreach (Inventory i in inv) {

      Console.WriteLine("    " + i);

    }

  }

}

Эта версия программы дает такой же результат, как и предыдущая.

Применение обобщенного интерфейса IСоmрагег<T>

Интерфейс IComparer<T> является обобщенным вариантом интерфейса IComparer. В нем определяется приведенный ниже обобщенный вариант метода Compare().

int Compare(Т х, Т у)

В этом методе сравниваются объекты х и у и возвращается нулевое значение, если значения сравниваемых объектов равны; положительное — если значение объекта х больше, чем у объекта у; и отрицательное — если значение объекта х меньше, чем у объекта у.

Ниже приведена обобщенная версия предыдущей программы учета товарных запасов, в которой теперь используется интерфейс IComparer<Т>. Она дает такой же результат, как и необобщенная версия этой же программы.

// Использовать обобщенный вариант интерфейса IComparer<T>.

using System;

using System.Collections.Generic;

// Создать объект типа IComparer<T> для объектов класса Inventory,

class CompInv<T> : IComparer<T> where T : Inventory {

  // Реализовать интерфейс IComparer<T>.

  public int Compare(T x, T y) {

    return string.Compare(x.name, y.name, StringComparison.Ordinal);

  }

}

class Inventory {

  public string name;

  double cost;

  int onhand;

  public Inventory(string n, double c, int h) {

    name = n;

    cost = c;

    onhand = h;

  }

  public override string ToString() {

    return

          String.Format("{0,-10} Цена: {1,6:С} В наличии: {2}",

                    name, cost, onhand);

  }

}

class GenericIComparerDemo {

  static void Main() {

    CompInv<Inventory> comp = new CompInv<Inventory>();

    List<Inventory> inv = new List<Inventory>();

   // Добавить элементы в список.

    inv.Add(new Inventory("Кусачки", 5.95, 3));

    inv.Add(new Inventory("Отвертки", 8.29, 2));

    inv.Add(new Inventory("Молотки", 3.50, 4));

    inv.Add(new Inventory("Дрели", 19.88, 8));

    Console.WriteLine("Перечень товарных запасов до сортировки:");

    foreach (Inventory i in inv) {

      Console.WriteLine("    " + i);

    }

    Console.WriteLine();

    // Отсортировать список, используя интерфейс IComparer.

    inv.Sort(comp);

    Console.WriteLine("Перечень товарных запасов после сортировки:");

    foreach (Inventory i in inv) {

      Console.WriteLine("    " + i);

    }

  }

}

Применение класса StringComparer

В простых примерах из этой главы указывать явно способ сравнения символьных строк совсем не обязательно. Но это может потребоваться в тех случаях, когда строки сохраняются в отсортированной коллекции или когда строки ищутся либо сортируются в коллекции. Так, если строки должны быть отсортированы с учетом настроек одной культурной среды, а затем их приходится искать с учетом настроек другой культурной среды, то во избежание ошибок, вероятнее всего, потребуется указать способ сравнения символьных строк. Аналогичная ситуация возникает и при хешировании коллекции. Для подобных (и других) случаев в конструкторах классов некоторых коллекций предусмотрена поддержка параметра типа IComparer. С целью явно указать способ сравнения символьных строк этому параметру передается в качестве аргумента экземпляр объекта класса StringComparer.

Класс StringComparer был подробно описан в главе 21 при рассмотрении вопросов сортировки и поиска в массивах. В этом классе реализуются интерфейсы IComparer, IComparer<String>, IEqualityComparer, а также IEqualityComparer<String>. Следовательно, экземпляр объекта типа StringComparer может быть передан параметру типа IComparer в качестве аргумента. В классе StringComparer определяется несколько доступных только для чтения свойств, возвращающих экземпляр объекта типа StringComparer, который поддерживает различные способы сравнения символьных строк. Как пояснялось в главе 21, к числу этих свойств относятся следующие: CurrentCulture, CurrentCulturelgnoreCase, InvariantCulture, InvariantCulturelgnoreCase, Ordinal, а также OrdinallgnoreCase. Все эти свойства можно использовать для явного указания способа сравнения символьных строк.

В качестве примера ниже показано, как коллекция типа SortedList<TKey, TValue> конструируется для хранения символьных строк, ключи которых сравниваются порядковым способом.

SortedList<string, int> users =

                  new SortedList<string, int>(StringComparer.Ordinal);

Доступ к коллекции с помощью перечислителя

К элементам коллекции нередко приходится обращаться циклически, например, для отображения каждого элемента коллекции. С этой целью можно, с одной стороны, организовать цикл foreach, как было показано в приведенных выше примерах, а с другой — воспользоваться перечислителем. Перечислитель — это объект, который реализует необобщенный интерфейс IEnumerator или обобщенный интерфейс IEnumerator<T>.

В интерфейсе IEnumerator определяется одно свойство, Current, необобщенная форма которого приведена ниже.

object Current { get; }

А в интерфейсе IEnumerator<T> объявляется следующая обобщенная форма свойства Current.

Т Current { get; }

В обеих формах свойства Current получается текущий перечисляемый элемент коллекции. Но поскольку свойство Current доступно только для чтения, то перечислитель может служить только для извлечения, но не видоизменения объектов в коллекции.

В интерфейсе IEnumerator определяются два метода. Первым из них является метод MoveNext(), объявляемый следующим образом.

bool MoveNext()

При каждом вызове метода MoveNext() текущее положение перечислителя смещается к следующему элементу коллекции. Этот метод возвращает логическое значение true, если следующий элемент коллекции доступен, и логическое значение false, если достигнут конец коллекции. Перед первым вызовом метода MoveNext() значение свойства Current оказывается неопределенным. (В принципе до первого вызова метода MoveNext() перечислитель обращается к несуществующему элементу, который должен находиться перед первым элементом коллекции. Именно поэтому приходится вызывать метод MoveNext(), чтобы перейти к первому элементу коллекции.)

Перейти на страницу:

Герберт Шилдт читать все книги автора по порядку

Герберт Шилдт - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


C# 4.0: полное руководство отзывы

Отзывы читателей о книге C# 4.0: полное руководство, автор: Герберт Шилдт. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*