Лучшее решение, на мой взгляд, с помощью фрагмента кода ниже:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
CGPoint touchLocation = [touch locationInView:self.view];
return !CGRectContainsPoint(self.menuButton.frame, touchLocation);
}
Что ж, было бы проще исключить их в первую очередь:
authorsList = authorsList.Where(x => x.FirstName != "Bob").ToList();
Однако это просто изменит значение авторасписок
вместо удаления авторов из списка предыдущий сборник. В качестве альтернативы вы можете использовать RemoveAll
:
authorsList.RemoveAll(x => x.FirstName == "Bob");
Если вам действительно нужно сделать это на основе другой коллекции, я бы использовал HashSet, RemoveAll и Contains:
var setToRemove = new HashSet<Author>(authors);
authorsList.RemoveAll(x => setToRemove.Contains(x));
LINQ берет свое начало в функциональном программировании, которое подчеркивает неизменность объектов, поэтому он не предоставляет встроенного способа обновления исходного списка на месте.
Замечание о неизменности (взято из другого ответа SO):
Вот определение неизменяемости из Википедии .
В объектно-ориентированном и функциональном программировании неизменяемый объект объект, состояние которого не может быть изменено после его создания.
Я думаю, вы могли бы сделать что-то вроде этого
authorsList = (from a in authorsList
where !authors.Contains(a)
select a).ToList();
Хотя я думаю, что уже приведенные решения решают проблему более читаемым способом.
Простое решение:
static void Main()
{
List<string> myList = new List<string> { "Jason", "Bob", "Frank", "Bob" };
myList.RemoveAll(x => x == "Bob");
foreach (string s in myList)
{
//
}
}
You cannot do this with standard LINQ operators because LINQ provides query, not update support.
But you can generate a new list and replace the old one.
var authorsList = GetAuthorList();
authorsList = authorsList.Where(a => a.FirstName != "Bob").ToList();
Or you could remove all items in authors
in a second pass.
var authorsList = GetAuthorList();
var authors = authorsList.Where(a => a.FirstName == "Bob").ToList();
foreach (var author in authors)
{
authorList.Remove(author);
}
Для этого лучше использовать List
authorsList.RemoveAll((x) => x.firstname == "Bob");