2012-01-17 4 views
1

У меня есть коллекция объектов, из которых я хочу удалить некоторые из них на основе вызова функции, который вернет true или false. См. Ниже приведенный ниже код -Удалить объект из коллекции

for each(MyClass obj in Objects) 
{ 
    if(!ValidateObject(obj) 
    { Objects.Remove(obj); } 
} 

Я не хочу использовать здесь петлю. Нужно использовать один код линейки для вышеуказанного образца. Спасибо заранее.

+0

Вы должны быть более точными. 1st - Является ли 'Objects' коллекцией' MyClass'? 2-й - Что вы пробовали до сих пор? Третий - В чем проблема? Опять же, если вы не спрашиваете вещи четко, это звучит так, как будто кто-то должен делать домашнее задание! ;) –

+1

Возможно, вы захотите объяснить причину «Я не хочу использовать цикл здесь». В конечном итоге каждое решение должно пройти через все элементы, удалив все, что не нужно. –

+0

@ HansKesting Я предполагаю, что нет никаких технических причин для его исследований, это просто сделать это в меньших количествах. –

ответ

3

Вы не можете изменять коллекцию при ее перечислении.

Попробуйте использовать Linq:

var validObjects = Objects.Where(z => ValidateObject(z)); 
+0

[ответ на удаленный ответ] Из того, что я понимаю из вопроса OP, он хочет удалить объекты и «не хочу использовать цикл здесь». Хорошо, здесь нет петли, использующей Linq. Это отвечает на вопрос. – ken2k

+0

Я так не думаю, Linq тоже делает петли.Хорошо, 'Where' делает цикл в одной строке, но это цикл снова. –

+0

Ваш код запутан, потому что ваша переменная 'obj' представляет несколько объектов. Также ваш код получает объекты, которые являются действительными, недействительными и не удаляют их. –

0

Используйте это, чтобы отфильтровать действительные объекты:

var validObjects = Objects.Where(t=>ValidateObject(obj)); 
+0

Я не вижу никакой разницы, используя Linq или итератор 'for-each', и он ничего не решает. –

+0

@ MatíasFidemraizer - можете ли вы объяснить, как он ничего не делает, если он фильтрует коллекцию и не использует цикл? –

+0

@GarryVass Да, вы правы, я пропустил «одну строчку», но, кстати, как вы думаете, ваш ответ решает «удалить объект из этой коллекции в одной строке»? –

5

Метод RemoveAll с предиката будет делать, если вы используете список

public int RemoveAll(
    Predicate<T> match 
) 

Делегат Predicate (Of T), который определяет а не условия удаления элементов.

List<MyClass > f = new List<MyClass >(); 
f.RemoveAll(x => ! ValidateObject(x)); 
+0

+1, но я думаю, что целью является удаление объектов, для которых ValidateObject возвращает false:! ValidateObject (x) –

+0

@Meta -Книга, я только что исправил это :) –

1

В конце концов, нет никакого способа, коллекция, которая печатается в IEnumerable<T>, ICollection<T> или так может удалить элемент, основываясь на некоторых критериях.

Но вы можете создать метод расширения, как это:

public static void CollectionsExtensions 
{ 
     public static void RemoveInvalidItems(this ICollection<MyClass> some) 
     { 
      foreach(MyClass item in some.ToList()) 
      { 
        if(!new Validator().ValidateObject(item)) // Your class having your validation method 
        { 
          some.Remove(item); 
        } 
      } 
     } 
} 

Таким образом, в конце концов, вы можете преобразовать свой цикл, чтобы удалить недействительные объекты в:

someCollectionOfMyClass.RemoveInvalidItems(); 

Резюме: вы можете удалить все недопустимые элементы в одной строке для любой коллекции, реализующей ICollection<MyClass>, которая включает в себя:

  • IList<T>
  • List<T>
  • и больше!
Смежные вопросы