Здравствуйте, Сантехник, Вы писали:
С>Здравствуйте, Wile, Вы писали:
W>>Похоже по скорости выполнения ты прав, W>>но вариант c IComparer'ом уж больно тяжеловат, а так хочется покороче...
С>Чем тяжеловат?
W>>Компарером. Его писать надо. В итоге коду больше.
С>Хе, ну дык тут стандартный выбор между производительностью и универсальностью. С>Хотя для обсуждаемой задачи компарер пишется за 3 секи.
Да это ясно, что за 3 секи, интересно просто, можно ли обойтись без компарера, и вообще без копирования
Здравствуйте, DEMON HOOD, Вы писали:
DH>Такой вопрос —
DH>есть набор элементов с которыми нужно работать, DH>пусть это будут случайные числа DH>использую ArrayList т.к удобно динамически увеличивать размерность массива, DH>но мне нужно также и удалять значения, например удалять все четные числа DH>ниже приведен примерный кусок кода, мне он не нравится, т.к нужно использовать DH>дополнительный массив, может нужно не ArrayList использовать?
Может тогда заюзать такой Comparer:
public class OddEvenComparer : IComparer
{
public int Compare(object x, object y)
{
if ((int)x % 2 == (int)y % 2)
{
return 0;
}
else
{
return ((int)x % 2 == 0) ? 1 : -1;
}
}
}
Отсортировать массив используя данный компарер. Т.о. получим массив в котором все четные в конце. И удалить этот конец.
дело в том что в МСДН для перебора элементов везде используют энумератор, что то вроде навязчивой рекламы...
Поэтому простейший способ вылетел из головы....
... <<silent Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Здравствуйте, Сантехник, Вы писали:
W>>А как тогда с точки зрения "good-practice" удалять из коллекции элементы в зависимости от условия, накладываемого на элементы этой же коллекции?
А ты вкурсе насколько твое вариант медленнее? Конечно любая модификация переменных чревата ошибками, но не до маразма же доводить? Эдак проще переходить на функциональные языки. Там как раз поощрается такой стиль.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Wile, Вы писали:
W>Да это ясно, что за 3 секи, интересно просто, можно ли обойтись без компарера, и вообще без копирования
Перебирай в цикле и копируй в другой массив. А массовые удаления из середины действительно чреваты. Правдо, если удалений немного или они приемущественно сзади, то все эти компареты и полиморфные методы перебора тоже к тормозам приведут.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>А ты вкурсе насколько твое вариант медленнее? Конечно любая модификация переменных чревата ошибками, но не до маразма же доводить? Эдак проще переходить на функциональные языки. Там как раз поощрается такой стиль.
В обсуждаемом случае медленнее, не спорю, но если брать general-case, то имхо допустимо.
Здравствуйте, <Аноним>, Вы писали:
А>Так нельзя. Проверьте на любом примере — пропустит половину элементов. Здесь, скорее, подошло бы что-то вроде while.
Так нет, но если после кажного удаления откатывать счетчик, то сработает.