перебирая коллекцию и удаляя те, которые я не хочу - PullRequest
2 голосов
/ 20 января 2011

У меня проблема со следующим.У меня есть коллекция:

Collection<Vehicle> list = new Collection<Vehicle>();

code = 1,2,3, Description = "aaa"
code = 10,438,13, Description = "bbb"
code = 81,8623,362, Description = "ccc"
code = 163,4312,53, Description = "ddd"
...

Но я забочусь только о некоторых из них .. Список, который меня интересует, находится здесь, т.е. codesCareAbout = "1 | 2 | 3 | 163 | 4312 | 53"

Мне нужно перебрать всю коллекцию и либо удалить Автомобиль, который меня не интересует, либо выбрать вишню в другой список, содержащий Машины, которые мне интересны?

Есть предложения?

Большое спасибо, Джеймс

Ответы [ 3 ]

4 голосов
/ 20 января 2011

Вы можете перебрать свой список в обратном порядке и использовать RemoveAt, используя индекс for для удаления из списка:

for (int i = list.Count - 1; i >= 0; i--)
{
    Foo item = list[i];

    if (IsFoobar(item))
        list.RemoveAt(i);
}

Необходим обратный отсчет, чтобы вы не изменили подсчет индексапо ходу дела использование цикла for является обязательным, поскольку вы не можете изменить список, перечисляемый перечислителем.

В качестве альтернативы, сделайте, как вы предложили, заполнить пустой список тем, что вам нужно - однако использование зависитнужно ли вам изменить список, который вам дан, или вы можете создать новый список.

0 голосов
/ 21 января 2011

Фильтрация списка с помощью linq дает самый чистый код:

var interestinglist = list.Where(v=> v.IsInteresting(v));

IsInteresting может быть реализован как

codesIcareAbout.Intersect(v.Codes).Any();

это предполагает, что оба поля являются коллекциями, а не строками, но это легко исправить с помощью вызова string.Split ().

0 голосов
/ 20 января 2011

Предполагая, что у автомобиля есть свойство Code (string) и свойство Description (вопрос не ясен!).

1 / Клонировать список: var clone = list.ToList();

2 / Выполнить итерацию и решить,текущий элемент интересен:

foreach(var item in clone)
{
   if (! IsInteresting(item))
      list.Remove(item);
}

3 / IsInteresting может быть, например:

foreach(var code in item.Code.Split(','))
{
    if (codesCareAbout.Split('|').Contains(code))
      return true;
}
...