You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 如何过滤Person列表中嵌套的Pets列表,仅保留年龄>5的宠物

问题解决方案

原代码问题原因

你编写的person.Pets.Where(pet => pet.Age > 5)仅生成了符合年龄条件的宠物新序列,没有修改Person对象原有的Pets属性值,因此不会产生预期的过滤效果。
LINQ的Where方法是无副作用的查询方法,只会返回符合条件的新序列,不会修改原数组/集合的内容,同时因为Pets是Pet[]数组类型,过滤后的序列需要调用ToArray()转成数组才能赋值给Pets属性。

实现代码

方案1:保留所有人员,仅过滤名下宠物

所有人员对象都会保留,不符合年龄要求的宠物会从对应人员的Pets数组中移除:

class Pet
{
    public string Name { get; set; }
    public int Age { get; set; }
}
class Person
{
    public string LastName { get; set; }
    public Pet[] Pets { get; set; }
}

public static void AllEx2()
{
    List<Person> people = new List<Person>
        { new Person { LastName = "Haas",
                       Pets = new Pet[] { new Pet { Name="Barley", Age=10 },
                                          new Pet { Name="Boots", Age=14 },
                                          new Pet { Name="Whiskers", Age=6 }}},
          new Person { LastName = "Fakhouri",
                       Pets = new Pet[] { new Pet { Name = "Snowball", Age = 1}}},
          new Person { LastName = "Antebi",
                       Pets = new Pet[] { new Pet { Name = "Belle", Age = 8} }},
          new Person { LastName = "Philips",
                       Pets = new Pet[] { new Pet { Name = "Sweetie", Age = 2},
                                          new Pet { Name = "Rover", Age = 13}} }
        };

    people.ForEach(person=>
        {
            // 将过滤后的宠物序列转数组,重新赋值给Pets属性
            person.Pets = person.Pets.Where(pet => pet.Age > 5).ToArray();
        });
}

执行后效果:

  • Haas名下保留全部3只符合条件的宠物
  • Fakhouri名下Pets为空数组
  • Antebi名下保留1只符合条件的宠物
  • Philips名下仅保留13岁的Rover

方案2:仅保留有符合条件宠物的人员

如果需要直接把名下没有年龄大于5的宠物的人员从列表中移除,在方案1的代码后追加一行过滤逻辑即可:

people = people.Where(person => person.Pets.Any()).ToList();

执行后Fakhouri会被从人员列表中移除。

内容的提问来源于stack exchange,提问作者Makhele Sabata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 03:39:03