首页 > 解决方案 > 基于谓词过滤对象内部的对象数组

问题描述

假设我有某种类型的对象,其中包含某种其他类型的数组:

public class Mammal
{
    public Leg[] Legs { get; set; }
}

public class Leg
{
    public int Length { get; }
}

例如,如果我接到Mammal某个GetMammals()电话,我将如何根据谓词(例如高度)进行Legs过滤?Mammal

Mammal.Legs.Where(l => l.Length > 10); 

上面会返回一个IEnumerable<Legs>,然后我必须找到一种方法将其塞回Mammal,但是是否有一种简洁的方法可以直接在我的Mammal对象上执行此操作,假设我以后必须将此filteredMammal对象用于其他用途?

标签: c#linqfilter

解决方案


您已经自己编写了解决方案。每个 linq 方法只返回一个新集合,而不是修改现有集合。

为此,您必须将返回的集合设置为您的哺乳动物属性:

myMammal.Legs = myMammals.Legs.Where(myPredicate).ToArray();

这假设您可以设置该属性。

另一个机会是编写一个Remove方法:

void Remove(Predicate<Leg> predicate)
{
    this.Legs = this.Legs.Where(x => !predicate(x)).ToArray();
}

不过,这仍然需要一个private二传手。

最好的方法是制作Legs一个List<Leg>. 然后你可以打电话RemoveAll

myMammal.Legs.RemoveAll(myPredicate);

推荐阅读