![]() |
|
Модераторы: gambit |
![]()
|
|
| Bonus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 4.10.2006 Репутация: нет Всего: нет |
пробую так:
это работает, но возвращаемое значение не Point, а double. Как на выходе получать именно Point (ну или тип который нужен мне)? |
|||
|
||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
В тупую |
|||
|
||||
| Bonus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 4.10.2006 Репутация: нет Всего: нет |
хм... сработало, спасибо
|
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: нет Всего: 67 |
HalkaR, о_О а просто Point maxX = points.Max(p => p.X); недостаточно?
-------------------- СУВ, Partizan. |
|||
|
||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
Partizan, так Bonus же сказал, что это возвращает X, а не Point.
|
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: нет Всего: 67 |
а....понял...
-------------------- СУВ, Partizan. |
|||
|
||||
| Idsa |
|
||||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 5 Всего: 62 |
Кстати-кстати. Тут не все так просто. Это один из тонких моментов в LINQ.
Первый вариант решения, который приходит на ум, - забить на LINQ и воспользоваться старым-добрым foreach. В этом случае за O(n) операций можно найти необходимый элемент. Чем не вариант? Да тем, что после LINQ ну очень не хочется писать подобный "низкоуровневый" перебор. Если говорить о LINQ решениях этой проблемы, то можно, например, отсортировать список по убыванию и взять первый элемент. Естественно, производительность в этом случае не выдерживает никакой критики (O log n операций и куча понапрасну использованной памяти). Если показать такое решение программисту со старой закалкой, его, наверное, инфаркт хватит Второй LINQ-вариант - использовать код, подобный тому, который написал HalkaR. Только вот, честно говоря, меня удивило, что Ведь этот код возвращает не Point, а коллекцию Point'ов. У меня такой код даже не комплируется (Resharper сразу ругается):
Кстати в том кусочке кода еще одна ошибка: переменная p объявляется два раза. Такое не скомпилируется. И выражение
надо заменить на что-нибудь вроде
Ну это так, мелочи: HalkaR просто опечатался. Чтобы заставить этот код делать именно то, что нужно, просто добавляем в конец вызов метода First:
Вот. Теперь компилятор не ругается и получает необходимый результат. Казалось бы, вот оно, счастье Конечно, пофиксить баг под кодовым названием "расчет point.Max при каждой итерации" не составит труда:
Все, что мы сделали, - вынесли вычисление максимального значения X за цикл. Итого, получаем 2*n операций. Лучше, конечно, но все равно попахивает законом дырявых абстракций. Но ведь если проблему нельзя решить "стандартными средствами", никто не запрещает создать свой собственный метод расширения (хвала С# 3.0). Упрощенная версия будет выглядеть примерно так:
Используем вот так:
Это заточенный вариант под этот пример. Конечно, лучше создать более унифицированный метод через дженерики, но мне лень Добавлено @ 18:24 Забыл добавить, что вариант с методом расширения выполняется за n операций. Это сообщение отредактировал(а) Idsa - 7.7.2008, 18:02 |
||||||||||||||
|
|||||||||||||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 5 Всего: 62 |
Метод расширения я немного неправильно написал. Нужно что-нибудь вроде этого:
Этот подход я позаимствовал в Reflector'е |
|||
|
||||
| akizelokro |
|
||||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: нет Всего: 5 |
Дружит ли, кстати, DLinq с user-defined типами?
Что вообще здесь пытается сделать автор, вытащить максимальную х-координату или точку максимальной длины? -------------------- a = a + b; b = a - b; a = a - b; |
||||
|
|||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 5 Всего: 62 |
||||
|
||||
| akizelokro |
|
||||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: нет Всего: 5 |
Спасибо. Ну вот и общий ответ на первый вопрос:
А вообще, все приведенные решения в общем случае неоптимальны. Но если автору темы хватает, то и бог с ними -------------------- a = a + b; b = a - b; a = a - b; |
||||
|
|||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 4 Всего: 49 |
||||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: нет Всего: 5 |
В каждом общем случае не могу. В конкретном общем - может получиться. Например, при частом использовании такой задачи, я бы создал индекс и делал бы выборку по нему (ага).
Предположу даже больше. Решения в общем случае как минимум не быстрее конкретных решений задач с индивидуальной спецификой. Угу? Это сообщение отредактировал(а) akizelokro - 11.7.2008, 14:16 -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 4 Всего: 49 |
akizelokro, решение в общем случае - это решение задачи на условиях, озвученных топикастером. Как раз "в общем случае" приведенные решения оптимальны. А в частных - ес-но нет. И это не повод писать в каждой теме "решение неоптимально".
Для задачи "выбрать из IEnumerable<Point> элемент с максимальным значением X" - решение оптимально в общем случае. А все предположения "а если бы задача была не такой, а другой", "а если бы мы решали частный случай, то общее решение было бы не оптимально" к решению вообще никакого отношения не имеют. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |