Перечисление коллекций, которые по своей сути не являются IEnumerable?

Если вы хотите рекурсивно перечислить иерархический объект, выбирая некоторые элементы на основе некоторых критериев, существует множество примеров таких методов, как "уплощение» а затем фильтрация с использованием Linq: как показано здесь:

текст ссылки

Но когда вы перечисляете что-то вроде коллекции Controls формы или коллекции Nodes TreeView, я не смог использовать эти типы методов, потому что они, похоже, требуют аргумента (для метода расширения), который является IEnumerable collection: передача в SomeForm.Controls не компилируется.

Самая полезная вещь, которую я нашел, была такой:

текст ссылки

Который дает вам метод расширения для Control.ControlCollection с результатом IEnumerable, который вы затем можете использовать с Linq.I '

Мы изменили приведенный выше пример, чтобы без проблем проанализировать узлы TreeView.

public static IEnumerable GetNodesRecursively(this TreeNodeCollection nodeCollection)
{
    foreach (TreeNode theNode in nodeCollection)
    {
        yield return theNode;

        if (theNode.Nodes.Count > 0)
        {
            foreach (TreeNode subNode in theNode.Nodes.GetNodesRecursively())
            {
                yield return subNode;
            }
        }
    }
}

Это тот код, который япишу сейчас, используя метод расширения:

    var theNodes = treeView1.Nodes.GetNodesRecursively();

    var filteredNodes = 
    (
        from n in theNodes
            where n.Text.Contains("1")
                select n
    ).ToList();

И я думаю, что может быть более элегантный способ сделать это, когда передаются ограничения.

Что я хочу знать, возможно ли определить такие процедуры в общем случае, чтобы: во время выполнения я мог передать тип коллекции, а также фактическую коллекцию, универсальному параметру, чтобы код не зависел от того, Это's TreeNodeCollection или Controls.Collection.

Мне также было бы интересно узнать, есть лиЛюбой другой способ (дешевле? быстрее?), чем тот, который показан во второй ссылке (выше), чтобы получить TreeNodeCollection или Control.ControlCollection в форме, используемой Linq.

Комментарий Леппи оSelectMany в SO сообщении, связанном с первым (выше), кажется намек.

Мои эксперименты с SelectMany были: ну, позвони имбедствия «. :)

Цените любые указатели. Я потратил несколько часов на чтение каждого поста, который касался этих областей, и пробирался к такой экзотике, как "Y-комбинатор. "A"унизительно» опыт, могу добавить :)

Ответы на вопрос(5)

Ваш ответ на вопрос