根据谓词过滤对象内部的对象数组

时间:2018-12-04 15:07:19

标签: c# linq filter

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

<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对象用于其他用途?

1 个答案:

答案 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);