Использование LINQ для удаления элементов из списка < T >

Лучшее решение, на мой взгляд, с помощью фрагмента кода ниже:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    CGPoint touchLocation = [touch locationInView:self.view];
    return !CGRectContainsPoint(self.menuButton.frame, touchLocation);
}
611
задан John M 19 January 2016 в 19:50
поделиться

6 ответов

Что ж, было бы проще исключить их в первую очередь:

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));
1086
ответ дан 22 November 2019 в 21:51
поделиться

LINQ берет свое начало в функциональном программировании, которое подчеркивает неизменность объектов, поэтому он не предоставляет встроенного способа обновления исходного списка на месте.

Замечание о неизменности (взято из другого ответа SO):

Вот определение неизменяемости из Википедии .

В объектно-ориентированном и функциональном программировании неизменяемый объект объект, состояние которого не может быть изменено после его создания.

0
ответ дан 22 November 2019 в 21:51
поделиться

Я думаю, вы могли бы сделать что-то вроде этого

    authorsList = (from a in authorsList
                  where !authors.Contains(a)
                  select a).ToList();

Хотя я думаю, что уже приведенные решения решают проблему более читаемым способом.

5
ответ дан 22 November 2019 в 21:51
поделиться

Простое решение:

static void Main()
{
    List<string> myList = new List<string> { "Jason", "Bob", "Frank", "Bob" };
    myList.RemoveAll(x => x == "Bob");

    foreach (string s in myList)
    {
        //
    }
}
20
ответ дан 22 November 2019 в 21:51
поделиться

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);
}
29
ответ дан 22 November 2019 в 21:51
поделиться

Для этого лучше использовать List .RemoveAll .

authorsList.RemoveAll((x) => x.firstname == "Bob");
130
ответ дан 22 November 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: