есть набор элементов с которыми нужно работать,
пусть это будут случайные числа
использую ArrayList т.к удобно динамически увеличивать размерность массива,
но мне нужно также и удалять значения, например удалять все четные числа
ниже приведен примерный кусок кода, мне он не нравится, т.к нужно использовать
дополнительный массив, может нужно не ArrayList использовать?
public static void ChangeValues( IList myList )
{
System.Collections.IEnumerator myEnumerator = myList.GetEnumerator();
while ( myEnumerator.MoveNext() )
{
//добавляю в другой ArrayList текущий номер, чтобы затем в другом цикле удалить
//эту запись
}
}
... <<Britney — camper Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Здравствуйте, DEMON HOOD, Вы писали:
DH>есть набор элементов с которыми нужно работать, DH>пусть это будут случайные числа DH>использую ArrayList т.к удобно динамически увеличивать размерность массива, DH>но мне нужно также и удалять значения, например удалять все четные числа DH>ниже приведен примерный кусок кода, мне он не нравится, т.к нужно использовать DH>дополнительный массив, может нужно не ArrayList использовать?
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, DEMON HOOD, Вы писали:
DH>>дополнительный массив, может нужно не ArrayList использовать?
AVK>А может проще не использовать энумератор?
как тогда? мне нужно переодически просматривать весь массив и манипулировать с хранимыми данными.
... <<Rammstein — Zwitter Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Здравствуйте, DEMON HOOD, Вы писали:
DH>Здравствуйте, AndrewVK, Вы писали:
AVK>>Здравствуйте, DEMON HOOD, Вы писали:
DH>>>дополнительный массив, может нужно не ArrayList использовать?
AVK>>А может проще не использовать энумератор? DH>как тогда? мне нужно переодически просматривать весь массив и манипулировать с хранимыми данными.
спросил и понял, что ступил
... <<Rammstein — Adios Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Здравствуйте, DEMON HOOD, Вы писали:
DH>Такой вопрос —
DH>есть набор элементов с которыми нужно работать, DH>пусть это будут случайные числа DH>использую ArrayList т.к удобно динамически увеличивать размерность массива, DH>но мне нужно также и удалять значения, например удалять все четные числа DH>ниже приведен примерный кусок кода, мне он не нравится, т.к нужно использовать DH>дополнительный массив, может нужно не ArrayList использовать?
DH>
DH> public static void ChangeValues( IList myList )
DH> {
DH> System.Collections.IEnumerator myEnumerator = myList.GetEnumerator();
DH> while ( myEnumerator.MoveNext() )
DH> {
DH> //добавляю в другой ArrayList текущий номер, чтобы затем в другом цикле удалить
DH> //эту запись
DH> }
DH> }
DH>
А если использовать следующий код:
public void DeleteEvenNumbers(ArrayList myArray)
{
for(int i=0; i<myArray.Count; i++ )
{
if (myArray[i]%2 == 0)
{
myArray.RemoveAt(i);
}
}
}
С>Менять контент коллекции в процессе перечисления ее элементов низзя.
Почему нельзя??? В этой ситуации енумератор не используется, поэтому можно.
Только надо учесть, что после удаления элемента myArray.RemoveAt(i), если ничего с переменной цикла i не делать — следующей итерацией ты перепрыгнешь через один элемент коллекции. Чтобы этого не было, добавляй i-- в теле цикла.
Здравствуйте, Wile, Вы писали:
W>А как тогда с точки зрения "good-practice" удалять из коллекции элементы в зависимости от условия, накладываемого на элементы этой же коллекции?
Здравствуйте, Сантехник, Вы писали:
С>Здравствуйте, Wile, Вы писали:
W>>А как тогда с точки зрения "good-practice" удалять из коллекции элементы в зависимости от условия, накладываемого на элементы этой же коллекции?
С>Ну, к примеру, мой вариант был здесь
Здравствуйте, Wile, Вы писали: _FR>>Несогласие как-нить прокоментировать возможно? W>Я прошу прощения, млин промахнулся... Ошибся сообщением, д.б. быть предыдущее... Я могу как-то исправить свою ошибку?
Ничего, с кем не случается
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, Сантехник, Вы писали:
С>Здравствуйте, 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.
Так нет, но если после кажного удаления откатывать счетчик, то сработает.