簡體   English   中英

從列表對象的列表字段中刪除元素的最佳方法

[英]Best way to remove elements from list field of list objects

我有對象建模文件和用戶:

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
                    }
                }
            },
        };

名稱字段 - 對象用戶列表文件包含對象列表文件。

如何刪除Size <= 10的用戶文件?

這種方式不起作用: users.SelectMany(u => u.Files).ToList().RemoveAll(f => f.Size <= 10);

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();

你也不能在IEnumerable<T>上使用RemoveAll ,它是一個List<T> -method。 這就是你在查詢中使用ToList()的原因。 但是通過這種方式你創建了一個與你的Files -list無關的新列表,它只包含相同的文件,但是集合是不同的,所以RemoveAll是沒有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM