Фильтрация массива объектов внутри объекта на основе предиката - PullRequest
0 голосов
/ 04 декабря 2018

Предполагая, что у меня есть объект какого-то типа, содержащий массив другого типа:

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 для чего-то еще позже?

1 Ответ

0 голосов
/ 04 декабря 2018

Вы уже написали решение самостоятельно.Каждый 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...