Фильтрация ICollection

Этот код не работает, но:

public virtual ICollection<SomeItem> items { get { return (ICollection<SomeItem>)items.Where(e => e.isVisible == true); } set { ;} }

Я хотел бы сделать что-то для этого. Таким образом, чтобы получить ICollection, отфильтрованный по свойству элементов коллекции.

Конечно, я мог бы пройтись по элементам и найти нужные, поместить их в новую коллекцию и вернуться с этим, но есть ли более хорошее решение?

2 ответа

Решение

Возможно, вы ищете метод расширения?

Методы расширения позволяют вам "добавлять" методы к существующим типам, не создавая новый производный тип, не перекомпилируя или иным образом не изменяя исходный тип.

public static class ExtensionMethods
{
    public static ICollection<SomeItem> OnlyVisible(this ICollection<SomeItem) items) {
        return items.Where(e => e.isVisible).ToList();
    }
}

Обратите внимание, что Where возвращает IEnumerable, который вы не можете изменить, поэтому я называю ToList() который по сути делает все в вашем последнем предложении.

Вы бы тогда использовали это так:

void Foo(ICollection<SomeItem> items) {

    foreach (var i in items.OnlyVisible()) {
        // Use i
    }
}

Пытаться:

items.Where(e => e.isVisible == true).ToList()
Другие вопросы по тегам