假设我有一个某种类型的对象,其中包含某种其他类型的数组:
<li>
如果我收到来自某个for (let key in this.locationsObject) {
_this.locationsObject[key].coordinates = calcPosFromLatLonRad(this.locationsObject[key].lat, this.locationsObject[key].long, 300);
let CSS3D_Object = new THREE.CSS3DSprite(_this.locationsObject[key].element);
CSS3D_Object.position.set(_this.locationsObject[key].coordinates[0], _this.locationsObject[key].coordinates[1], _this.locationsObject[key].coordinates[2]);
CSS3D_Object.receiveShadow = false;
CSS3D_Object.castShadow = false;
sceneHTML.add(CSS3D_Object);
_this.locationsObject[key].CSS_Object = CSS3D_Object;
console.info(CSS3D_Object);
}
调用的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
对象用于其他用途?
答案 0 :(得分:2)
您已经准备好自己编写解决方案。每个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);