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

1 ... 109 110 111 [ 112 ] 113 114 115 ... 396


else if (x.R < y.R) {

return -1;

return 0;

public static bool TopRightQuadrant(Vector target) {

if (target.Theta >= 0.0 && target.Theta <= 90.0) {

return true;

else

return false;

9. Измените код в файле Program, cs, как показано ниже:

static void Main(string [ ] args) {

Vectors route = new Vectors (); route.Add(new Vector (2.0, 90.0)) ; route.Add(new Vector (1.0, 180.0)) ; route.Add(new Vector (0.5, 45.0)) ; route.Add(new Vector (2.5, 315.0));

Console.WriteLine(route.Sum());

Comparison<Vector> sorter = new Comparison<Vector>(VectorDelegates.Compare); route.Sort(sorter); Console.WriteLine(route.Sum()) ;

Predicate<Vector> searcher =

new Predicate<Vector>(VectorDelegates.TopRightQuadrant); Vectors topRightQuadrantRoute = new Vectors(route.FindAll(searcher)); Console.WriteLine(topRightQuadrantRoute.Sum()); Console.ReadKey();

10. Запустите приложение. На рис. 12.4 показан результат, который должен полу-

читься.

I 11 .У:УВедУС$Г1агр/СГ1а к12/СМ2Ех03/СМ2Е11г03Л)т/Ов ид/СМ2Ех03.ЕХ£

i-i.in Of. ?Й> . <1. 18И . <в.5, 45) . <2.!.. M162U>

ri.in i <и... r.> . 1, 18И> . <2. ЧвУ . <2.Ь. 31 .> <l.H .51tw,v;:

rilin <И.Ь. АЧУ <И. И> <2. IVVV .H8 1:И?И(. HI .V,t,BV,lHSi¥rr/>

Puc. 12.4. приложение Chl2Ex03 в действии

Описание полученных результатов

В этом примере создается класс коллекции Vectors для класса Vector, созданного в Chl2Ex01. Конечно, можно было бы и просто использовать переменную типа List<Vector>, но поскольку требуется дополнительная функциональность, используется новый класс - Vectors, унаследованный от List<Vector> и позволяющий добавлять какие угодно члены.



Одним из таких членов является метод Sum (). Он возвращает строку, в которой по очереди перечисляется каждый вектор, а также результат сложения этих всех векторов вместе (с помощью перегруженной операции из исходного класса Vector). Поскольку каждый вектор может пониматься как направление и расстояние, это, по сути, приводит к образованию маршрута с конечной точкой:

public string Sum() {

StringBuilder sb = new StringBuilder();

Vector currentPoint = new Vector (0.0, 0.0);

sb.Append( origin );

foreach (Vector vector in this)

sb.AppendFormat( + {0} , vector); currentPoint += vector;

sb.AppendFormat( = {0} , currentPoint); return sb.ToString0;

В этом методе для построения строки ответа применяется удобный класс StringBuilder, содержащийся в пространстве имен System. Text. У этого класса есть члены, вроде используемых здесь методов Append () и AppendFormat (), которые упрощают процесс сборки строки, обеспечивая более высокую производительность, чем может достигаться конкатенацией отдельных строк. Для получения результирующей строки тоже применяется метод этого класса, а именно - ToString ().

Еще создаются два новых метода, подлежащие использованию в качестве делегатов, т.е. в качестве статических членов VectorDelegates. Метод Compare () предназначен для выполнения сравнения (сортировки), а метод TopRightQuadrant () - для поиска. О них более подробно будет рассказываться при рассмотрении кода в Program, cs.

Код в Main () начинается с инициализации коллекции Vectors, в которую добавляется несколько объектов:

Vectors route = new Vectors(); route.Add(new Vector (2.0, 90.0)); route.Add(new Vector (1.0, 180.0)) ; route.Add(new Vector (0.5, 45.0)); route.Add(new Vector (2.5, 315.0));

Метод Vectors. Sum () применяется для вывода элементов в коллекции, как уже отмечалось ранее, но на этот раз в их первоначальном порядке:

Console.WriteLine(route.Sum());

Далее создается первый из делегатов - sorter. Этот делегат является делегатом типа Comparison<Vector> и потому ему может быть назначен метод со следующим возвращаемым типом и параметрами:

int метод (Vector objectA, Vector objectB)

Эта сигнатура соответствует сигнатуре метода VectorDelegates. Compare (), который потому далее и назначается этому делегату:

Comparison<Vector> sorter = new Comparison<Vector> (VectorDelegates.Compare);

Метод Compare () сравнивает модули двух векторов следующим образом:

public static int Compare(Vector x. Vector y) {

if (x.R > y.R)



return 1;

else if (x.R < y.R)

return -1;

return 0;

Это позволяет упорядочивать векторы по модулю:

route.Sort(sorter) ; Console.WriteLine(route.Sum());

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

Далее посредством поиска получается подмножество векторов в коллекции. Это подразумевает использование метода VectorDelegates . TopRightQuadrant ():

public static bool TopRightQuadrant(Vector target) {

if (target.Theta >= 0.0 && target.Theta <= 90.0) {

return true;

else {

return false;

Этот метод возвращает true, если в его аргументе Vector содержится значение Theta в диапазоне от О до 90 градусов, т.е. если вектор в диаграмме (вроде той, что показывалась ранее) указывает вверх и/или вправо.

В методе Main () данный метод используется через делегат типа Predicate<Vector>, как показано ниже:

Predicate<Vector> searcher =

new Predicate<Vector>(VectorDelegates.TopRightQuadrant); Vectors topRightQuadrantRoute = new Vectors(route.FindAll(searcher)); Console.WriteLine(topRightQuadrantRoute.Sum());

Это требует определения в Vectors соответствующего конструктора:

public Vectors(IEnumerable<Vector> initialltems) (

foreach (Vector vector in initialltems) {

Add(vector);

Здесь новая коллекция инициализируется с использованием интерфейса IEnumerable<Vector>, что необходимо потому, что List<Vector>. FindAll () возвращает экземпляр List<Vector>, а не экземпляр Vectors.

В результате выполнения поиска возвращается только подмножество объектов Vector, так что (как и следовало ожидать) результат суммирования выглядит по-дру-



1 ... 109 110 111 [ 112 ] 113 114 115 ... 396

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