基于谓词筛选对象内部的对象数组



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

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

例如,如果我从某个GetMammals()调用接收到Mammal,我将如何根据谓词(例如高度(在Mammal中过滤Legs

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

上面会返回一个IEnumerable<Legs>,然后我必须找到一种方法将其重新填充到Mammal中,但如果以后我必须使用这个filteredMammal对象进行其他操作,是否有一种巧妙的方法可以直接在我的Mammal对象上执行此操作?

您已经自己编写了解决方案。每个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);

最新更新