|
Программирование >> Программирование с использованием ajax
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, так что (как и следовало ожидать) результат суммирования выглядит по-дру-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |