Удалить объект из коллекции - PullRequest
1 голос
/ 17 января 2012

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

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

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

Ответы [ 4 ]

5 голосов
/ 17 января 2012

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

public int RemoveAll(
    Predicate<T> match
)

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

 List<MyClass > f = new List<MyClass >();
 f.RemoveAll(x => ! ValidateObject(x) );
3 голосов
/ 17 января 2012

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

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

var validObjects = Objects.Where(z => ValidateObject(z));
1 голос
/ 17 января 2012

В конце концов, ни в коем случае коллекция, которая имеет тип 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>
  • и больше!
0 голосов
/ 17 января 2012

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

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