Лучший способ удалить элементы из поля списка объектов списка - PullRequest
0 голосов
/ 19 октября 2018

У меня есть объекты модели Файл и Пользователь:

public class File
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
    public uint Size { get; set; }
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<File> Files { get; set; }
}

Я создал список объектов модели:

var users = new List<User> { new User
            {
                Id = 1,
                Name = "Alex",
                Files = new List<File>
                {
                    new File
                    {
                        Id = 1,
                        Name = "123.txt",
                        Size = 20000
                    }
                    new File
                    {
                        Id = 3,
                        Name = "111.txt",
                        Size = 10
                    }
                }
            },
            new User
            {
                Id = 2,
                Name = "Andry",
                Files = new List<File>
                {
                    new File
                    {
                        Id = 1,
                        Name = "file.txt",
                        Size = 3
                    },
                    new File
                    {
                        Id = 2,
                        Name = "file.mp3",
                        Size = 4342
                    }
                }
            },
            new User
            {
                Id = 3,
                Name = "Jon",
                Files = new List<File>
                {
                    new File
                    {
                        Id = 1,
                        Name = "site.txt",
                        Size = 3324
                    }
                }
            },
        };

Поле с именем - Файлы объектаСписок пользователей содержит список объектов File.

Как удалить файлы пользователей с Size <= 10?

Этот способ не работает: users.SelectMany(u => u.Files).ToList().RemoveAll(f => f.Size <= 10);

1 Ответ

0 голосов
/ 19 октября 2018

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

IEnumerable<User> usersWithSmallFiles = users
    .Where(u => u.Files.Any(f => f.Size <= 10));

foreach (User u in usersWithSmallFiles)
    u.Files = u.Files.Where(f => f.Size > 10).ToList();

Вы также не можете использовать RemoveAll на IEnumerable<T>, это List<T> -метод.Вот почему вы использовали ToList() в запросе.Но таким образом вы создаете новый список, который не связан с вашим Files -листом, он просто содержит те же файлы, но коллекция отличается, поэтому RemoveAll не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...