удаление элементов ArrayList
От: DEMON HOOD  
Дата: 08.11.04 20:48
Оценка:
Такой вопрос —

есть набор элементов с которыми нужно работать,
пусть это будут случайные числа
использую 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 >>
Re: удаление элементов ArrayList
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.11.04 21:17
Оценка: 1 (1)
Здравствуйте, DEMON HOOD, Вы писали:

DH>есть набор элементов с которыми нужно работать,

DH>пусть это будут случайные числа
DH>использую ArrayList т.к удобно динамически увеличивать размерность массива,
DH>но мне нужно также и удалять значения, например удалять все четные числа
DH>ниже приведен примерный кусок кода, мне он не нравится, т.к нужно использовать
DH>дополнительный массив, может нужно не ArrayList использовать?

А может проще не использовать энумератор?
... << RSDN@Home 1.1.4 beta 3 rev. 228>>
AVK Blog
Re[2]: удаление элементов ArrayList
От: DEMON HOOD  
Дата: 08.11.04 21:39
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, DEMON HOOD, Вы писали:


DH>>дополнительный массив, может нужно не ArrayList использовать?


AVK>А может проще не использовать энумератор?

как тогда? мне нужно переодически просматривать весь массив и манипулировать с хранимыми данными.
... <<Rammstein — Zwitter Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Re[3]: удаление элементов ArrayList
От: DEMON HOOD  
Дата: 08.11.04 21:52
Оценка: :)
Здравствуйте, 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 >>
Re: удаление элементов ArrayList
От: kondrat_kiev  
Дата: 09.11.04 06:58
Оценка: 1 (1)
Здравствуйте, 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);
        }
    }
}
... << RSDN@Home 1.1.3 stable >>
Re[2]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 07:27
Оценка: :)
Здравствуйте, kondrat_kiev, Вы писали:

_>А если использовать следующий код:

_>
_>public void DeleteEvenNumbers(ArrayList myArray)
_>{
_>    for(int i=0; i<myArray.Count; i++ )
_>    {
_>        if (myArray[i]%2 == 0)
_>        {
_>            myArray.RemoveAt(i);
_>        }
_>    }
_>}
_>


Менять контент коллекции в процессе перечисления ее элементов низзя.
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 07:27
Оценка:
Можно пробегать по исходному списку и нужные элементы, т.е. те, которые не надо удалять, копировать в новый список, типа
IList FilterList(IList sourceList, IComparer criteria)
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re[2]: удаление элементов ArrayList
От: _FRED_ Черногория
Дата: 09.11.04 07:45
Оценка:
Здравствуйте, kondrat_kiev, Вы писали:
_>А если использовать следующий код:
_>
_>public void DeleteEvenNumbers(ArrayList myArray)
_>{
_>    for(int i=0; i<myArray.Count; i++ )
_>    {
_>        if (myArray[i]%2 == 0)
_>        {
_>            myArray.RemoveAt(i);
_>        }
_>    }
_>}
_>

Так не будет работать, например, со списком, состоящим только из чётных элементов.
А так должно.
      for(int i = 0; i < myArray.Count;) {
        if((int)myArray[i] % 2 == 0) {
          myArray.RemoveAt(i);
        } else {
          i++;
        }//if
      }//for
Help will always be given at Hogwarts to those who ask for it.
Re[3]: удаление элементов ArrayList
От: _FRED_ Черногория
Дата: 09.11.04 07:48
Оценка: +2
Здравствуйте, Сантехник, Вы писали:
_>>public void DeleteEvenNumbers(ArrayList myArray)
_>>{
_>>    for(int i=0; i<myArray.Count; i++ )
_>>    {
_>>        if (myArray[i]%2 == 0)
_>>        {
_>>            myArray.RemoveAt(i);
_>>        }
_>>    }
_>>}

С>Менять контент коллекции в процессе перечисления ее элементов низзя.

В приведённом примере можно. Нельзя при запущенном IEnumerator, а здесь он не используется.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: удаление элементов ArrayList
От: Wile  
Дата: 09.11.04 07:48
Оценка:
С>Менять контент коллекции в процессе перечисления ее элементов низзя.

Почему нельзя??? В этой ситуации енумератор не используется, поэтому можно.
Только надо учесть, что после удаления элемента myArray.RemoveAt(i), если ничего с переменной цикла i не делать — следующей итерацией ты перепрыгнешь через один элемент коллекции. Чтобы этого не было, добавляй i-- в теле цикла.
Re[4]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 07:55
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>В приведённом примере можно. Нельзя при запущенном IEnumerator, а здесь он не используется.


Я имел в виду не конкретно этот пример, а как good-practice в принципе.
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re[5]: удаление элементов ArrayList
От: Wile  
Дата: 09.11.04 08:02
Оценка:
С>Я имел в виду не конкретно этот пример, а как good-practice в принципе.

А как тогда с точки зрения "good-practice" удалять из коллекции элементы в зависимости от условия, накладываемого на элементы этой же коллекции?
Re[6]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 08:20
Оценка:
Здравствуйте, Wile, Вы писали:

W>А как тогда с точки зрения "good-practice" удалять из коллекции элементы в зависимости от условия, накладываемого на элементы этой же коллекции?


Ну, к примеру, мой вариант был здесь
Автор: Сантехник
Дата: 09.11.04
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re[7]: удаление элементов ArrayList
От: Wile  
Дата: 09.11.04 08:32
Оценка:
Здравствуйте, Сантехник, Вы писали:

С>Здравствуйте, Wile, Вы писали:


W>>А как тогда с точки зрения "good-practice" удалять из коллекции элементы в зависимости от условия, накладываемого на элементы этой же коллекции?


С>Ну, к примеру, мой вариант был здесь
Автор: Сантехник
Дата: 09.11.04


С>Можно пробегать по исходному списку и нужные элементы, т.е. те, которые не надо удалять, копировать в С>новый список...


А если коллекция здоровая?
Re[4]: удаление элементов ArrayList
От: _FRED_ Черногория
Дата: 09.11.04 08:38
Оценка:
Несогласие как-нить прокоментировать возможно?
Help will always be given at Hogwarts to those who ask for it.
Re[8]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 08:40
Оценка: +1
Здравствуйте, Wile, Вы писали:

W>А если коллекция здоровая?


Если здоровая, то, имхо, накладные расходы на копирование элементов при удалении элементов из середины ArrayList'а в этом варианте

public void DeleteEvenNumbers(ArrayList myArray)
{
    for(int i=0; i<myArray.Count; i++ )
    {
        if (myArray[i]%2 == 0)
        {
            myArray.RemoveAt(i);
        }
    }
}



будут нехилые.
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Re[5]: удаление элементов ArrayList
От: Wile  
Дата: 09.11.04 08:47
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Несогласие как-нить прокоментировать возможно?


Я прошу прощения, млин промахнулся... Ошибся сообщением, д.б. быть предыдущее... Я могу как-то исправить свою ошибку?
... << Rsdn@Home 1.1.4 beta 1 >>
Re[6]: удаление элементов ArrayList
От: _FRED_ Черногория
Дата: 09.11.04 08:53
Оценка:
Здравствуйте, Wile, Вы писали:
_FR>>Несогласие как-нить прокоментировать возможно?
W>Я прошу прощения, млин промахнулся... Ошибся сообщением, д.б. быть предыдущее... Я могу как-то исправить свою ошибку?

Ничего, с кем не случается
Help will always be given at Hogwarts to those who ask for it.
Re[9]: удаление элементов ArrayList
От: Wile  
Дата: 09.11.04 09:09
Оценка:
Похоже по скорости выполнения ты прав,
но вариант c IComparer'ом уж больно тяжеловат, а так хочется покороче...
... << Rsdn@Home 1.1.4 beta 1 >>
Re[10]: удаление элементов ArrayList
От: Сантехник Беларусь  
Дата: 09.11.04 09:20
Оценка:
Здравствуйте, Wile, Вы писали:

W>Похоже по скорости выполнения ты прав,

W>но вариант c IComparer'ом уж больно тяжеловат, а так хочется покороче...

Чем тяжеловат?
... << RSDN@Home 1.1.4 beta 3 rev. 225>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.