假设我有一个某种类型的对象,包含一个其他类型的数组:
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);