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

1 ... 91 92 93 [ 94 ] 95 96 97 ... 396


public Card this[int cardlndex] {

get {

return (Card)List[cardlndex];

set {

List[cardlndex] = value;

Вспомогательный метод для копировгшия экземпляров Card в другой

экземпляр Cards - используемый в Deck. Shuffle () . В данной реализахц1и

предполагается, что исходная коллекция и целевая коллекция

имеют одинаковый размер.

public void СоруТо (Cards targetCards)

for (int index = 0; index < this.Count; index++) {

targetCards[index] = this[index];

не в стандартном формате практического занятия. При желании можете открыть версию данного проекта, входящую в состав загружаемого кода для этой главы.

Не забудьте, что при копировании исходных файлов из ChlOCardLib в ChllCardLib нужно обязательно изменить объявления пространств имен так, чтобы они ссылались на ChllCardLib. То же самое касается и консольного приложения Chi OCardClient, которое вы будете использовать для тестирования.

В состав загружаемого кода входит проект, содержащий весь код, который может потребоваться для обеспечения различных расширенных возможностей в ChllCardLib. Этот код поделен на разделы, в каждом из которых можно удалять комментарии при желании испробовать его в действии.

Если же вы хотите создать данный проект самостоятельно, добавьте в него новый класс Cards и измените код в представляющем его файле Cards. cs следующим образом:

using System;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ChllCardLib

public class Cards : CollectionBase

public void Add (Card newCard)

List.Add(newCard); public void Remove (Card oldCard)

List.Remove(oldCard); public Cards 0



Выполнение проверки для выяснения, содержится

зт ъ коллекхц1и Cards определенная карта.

Эта проверка подразумевает вызов для коллекхц1и метода

Contains коллекции ArrayList, доступ к которому

получается через свойство InnerList.

public bool Contains(Card card)

return InnerList.Contains(card);

Теперь измените код в файле Deck.сs так, чтобы в нем использовалась эта новая коллекция, а не массив:

using System;

using System.Collections.Generic; using System.Linq; using System.Text; namespace ChllCardLib

public class Deck {

private Cards cards = new Cards () ;

public DeckO {

Здесь была удалена строка кода

for (int suitVal = 0; suitVal < 4; suitVal + + ) {

for (int rankVal = 1; rankVal < 14; rankVal++) {

cards .Add (new Card ((Suit) suitVal, (Rank) rankVal)) ;

public Card GetCard(int cardNum) {

if (cardNum >= 0 && cardNum <= 51)

return cards[cardNum]; else

tlirow (new System.ArgumentOutOfRangeException ( cardNum , cardNum, Value must be between 0 and 51. ));

public void SliuffleO {

Cards newDeck = new Cards () ;

bool[] assigned = new bool[52]; Random sourceGen = new Random(); for (int i = 0; i < 52; i++) {

int sourceCard = 0;

bool foundCard = false; wliile (foundCard == false) {

sourceCard = sourceGen.Next(52); if (assigned[sourceCard] = false)

foundCard = true;

assigned[sourceCard] = true;



Глава И. Коллекции, сравнения и преобразования 303 newDeck.Add(cards[sourceCard]);

newDeck.CopyTo(cards);

Здесь требуется не очень много изменений. Большая часть из них состоит в изменении логики тасования так, чтобы она предусматривала факт добавления карты в начало новой Cards-коллекции newDeck из позиции со случайным индексом в cards, а не в позицию со случайным индексом в newDeck из последовательной позиции в cards.

Клиентское консольное приложение СЫOCardClient, создававшееся для решения ChlOCardLib, может применяться с этой новой библиотекой с тем же результатом, поскольку сигнатуры методов Deck не изменились. Клиенты этой библиотеки классов теперь, однако, смогут использовать класс коллекции Cards, а не полагаться на массивы объектов Card, например, в случае определения имеющихся на руках карт в приложении для игры в карты.

Ключевые коллекции и интерфейс iDictionary

Вместо интерфейса IList также допускается, чтобы коллекции реализовали похожий интерфейс IDictionary, который позволяет, чтобы элементы индексировались с помощью ключевого значения (например, строкового имени), а не индекса. Подобное поведение также достигается с помощью индексатора, хотя в таком случае в качестве параметра для индексатора указывается ключ, ассоциируемый с хранимым элементом, а не индекс int, что может делать коллекцию гораздо более дружественной к пользователю.

Как и в случае индексированных коллекций, существует базовый класс, который можно использовать для упрощения интерфейса IDictionary - DictionaryBase. Этот класс тоже поддерживает интерфейсы lEnumerable и ICollection и предлагает базовые возможности для манипулирования, которые одинаковы для любой коллекции.

Класс DictionaryBase подобно CollectionBase реализует некоторые (не все) из тех членов, которые получает от поддерживаемых им интерфейсов. В частности, как и класс CollectionBase, он реализует члены Clear и Count, но не член RemoveAt (), поскольку тот является методом интерфейса IList и не присутствует в интерфейсе IDictionary. Но зато у интерфейса IDictionary есть метод Remove (), и этот метод является одним из тех, которые следует реализовать в классе специальной коллекции на базе DictionaryBase.

В следующем коде демонстрируется альтернативная версия класса Animals, на этот раз унаследованная от DictionaryBase и включающая реализации методов Add () и Remove (), а также индексатора с доступом по ключу:

public class Animals : DictionaryBase {

public void Add(string newID, Animal newAnimal) Dictionary.Add(newID, newAnimal);

public void Remove(string animallD)

Dictionary.Remove(animallD); public Animals()



1 ... 91 92 93 [ 94 ] 95 96 97 ... 396

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