Как избежать методов, вызывающих друг друга в цепочке? - PullRequest
2 голосов
/ 21 сентября 2011

У меня есть класс C #, где я использую набор методов для фильтрации списка. По сути, я делаю это одним способом изнутри другого и так далее. Таким образом, a (значения) выполняет некоторую фильтрацию на основе выходных вызовов b (список значений) или завершается, b (список значений) выполняет некоторую фильтрацию и на основе выходных вызовов c (список значений).

Я хочу удалить этот цепочечный код метода и управлять всем из метода, который вызывает (Список значений). Я могу использовать if-else-if, но это приведет к слишком большому количеству if-else-ifs, которые я не считаю настолько хорошими.

Есть ли какие-то шаблоны проектирования, чтобы решить эту проблему? Или какой-нибудь алгоритм? Любая помощь приветствуется.

Спасибо. Gaurav

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

То, что вы читаете, звучит как типичный сценарий использования LINQ с шаблоном итератора (его можно легко реализовать в C # с помощью блоков итераторов ).

var results =
     someCollection
        .Where(c => c.SomeProperty < someValue * 2)
        .Where(c => c.OtherProperty == "hi")
        .OrderBy(c => c.AnotherProperty)
        .Select(c => new {c.SomeProperty, c.OtherProperty});

Или как выражение запроса:

var results =  from c in SomeCollection
           where c.SomeProperty < someValue * 2
           where c.OtherProperty == "Hi"
           orderby c.AnotherProperty
           select new {c.SomeProperty, c.OtherProperty};

Вы можете связать столько операций, сколько пожелаете. Конечно, доступны и более сложные операции, такие как объединения и группировки.

Я рекомендую книгу Джона Скита C # in Depth , если вы действительно хотите изучить эти методы (и многие другие).

1 голос
/ 21 сентября 2011

Я хочу удалить этот цепочечный код этого метода и контролировать все из метода, который вызывает (Список значений)

Ну, поскольку вы фильтруете значения, вы можете использовать что-то вроде LINQKit PredicateBuilder , который позволит вам создать список фильтров и применить их к выражению linq

Однако, если вы делаете больше, чем просто фильтрацию, вы можете использовать create instance of Action<T> Делегируйте для представления действий, которые можно выполнить в вашем списке, а затем примените их.

Существует также возможность использования CPS с продолжением в стиле продолжения, но подумайте о том, какэто работает, у меня кровоточат уши.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...