Получить текущий индекс для удаления в коллекции строк - PullRequest
2 голосов
/ 26 июля 2010

У меня есть коллекция строк, которая заполнена идентификаторами, например так ->

12345
23456
34567

и так далее.Что мне нужно сделать, это по запросу пользователя, и когда определенные параметры будут выполнены, просмотрите этот список, начиная с верхней части, и выполните метод () с использованием этого идентификатора.В случае успеха я удалил бы его из списка и пошел бы дальше.

Я, смущающе, никогда раньше не работал с коллекцией таким образом.Может кто-нибудь направить меня в правильном направлении.Все примеры, похоже, относятся к разнообразию Console.Writeline("");.

Моя база, невежественная попытка выглядит следующим образом ->

 var driUps = Settings.Default.DRIUpdates.GetEnumerator();
        while (driUps.MoveNext())
        {
            var wasSuccessfull = PerformDRIUpdate(driUps.Current);
            if (wasSuccessfull)
            {
                driUps.Current.Remove(driUps.Current.IndexOf(driUps.Current));
            }
        }

Часть, которая меня больше всего волнует, это Remove(); Нет ли лучшего способа получить Текущий индекс?Любые советы, подсказки, критика, указатели и т.д .... добро пожаловать.Спасибо!

Ответы [ 4 ]

4 голосов
/ 26 июля 2010

Вы совершенно правы, если будете беспокоиться об удалении при перечислении.Как насчет чего-то вроде этого:

int idx = 0;
while (idx < strCol.Count)
{
    var wasSuccessful = PerformDRIUpdate(strCol[idx]);
    if (wasSuccessful)
        strCol.RemoveAt(idx);
    else
        ++idx;
}
1 голос
/ 27 июля 2010

Как предлагает n8wrl, использование RemoveAt решает проблему с попыткой удаления элемента при перечислении коллекции, но для больших коллекций удаление элементов с фронта может вызвать проблемы с производительностью, поскольку базовая коллекция перестраивается.Проложите свой путь от конца коллекции и уберите предметы с этого конца:

//Loop backwards, as removing from the beginning
//causes underlying collection to be re-built
int index = (strCol.Count - 1);

while (index >= 0)
{
    if (PerformDRIUpdate(strCol[index]))
    { 
        strCol.RemoveAt(index);
    }

    --index;
}
0 голосов
/ 27 июля 2010

Если driUps является IEnumerable<T>, попробуйте это:

driUps = driUps.Where(elem => !PerformDRIUpdate(elem));

Обновление:

Из примера кажется, что это более уместно:

Settings.Default.DRIUpdates = 
  Settings.Default.DRIUpdates.Where(elem => !PerformDRIUpdate(elem));

Для List<T> проще:

list.RemoveAll(PerformDRIUpdate);
0 голосов
/ 26 июля 2010

Итерации перечислителя лучше всего выполнять с помощью foreach (), он выполняет GetEnumerator () и создает блок, похожий на тот, что вы получаете, синтаксис:

foreach(ObjectType objectInstance in objectInstanceCollection)
{
    do something to object instance;
}

для вас,

List<DRIUpdate> updatesToRemove = new List<DRIUpdate>();
foreach(DRIUpdate driUpdate in Settings.Default.DRIUpdates)
{
    if (PerformDRIUpdate(driUpdate))
    {
        updatesToRemove.Add(driUpdate);
    }
}

foreach(DRIUpdate driUpdate in updatesToRemove)
{
    Settings.Default.DRIUpdates.Remove(driUpdate);
}
...