【问题标题】:Best way to remove elements from list field of list objects从列表对象的列表字段中删除元素的最佳方法
【发布时间】:2018-10-19 09:33:43
【问题描述】:

我有对象模型文件和用户:

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 &lt;= 10用户的文件?

这种方式行不通: users.SelectMany(u =&gt; u.Files).ToList().RemoveAll(f =&gt; f.Size &lt;= 10);

【问题讨论】:

  • 我不清楚您是想修改users 列表还是想要一个包含除部分文件之外的所有文件的新列表。
  • 如何获取文件大小 > 10 的用户列表?我想得到用户列表的结果。
  • 不要在 cmets 中回答我,而是编辑您的问题并改进它。
  • users = users.Select(x => new User() { Id = x.Id, Name = x.Name, Files = x.Files.Where(y => y.Size > 10 ) }).ToList();

标签: c# .net list linq


【解决方案1】:

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&lt;T&gt; 上使用RemoveAll,这是一个List&lt;T&gt; 方法。这就是您在查询中使用ToList() 的原因。但是通过这种方式,您创建了一个与您的Files-list 无关的新列表,它只包含相同的文件但集合不同,因此RemoveAll 毫无意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多