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
相关产品推荐
相关产品推荐

