Есть ли лучше или более компактный способ добавления элементов в TreeView с помощью LINQ?


Я использую следующий код, чтобы добавить узлы в TreeView. Есть ли лучше или более компактный способ сделать это с помощью LINQ?

foreach (Plan plan in this.IncomingPlan.Plans)
{
    foreach (Document doc in plan.Documents.Where(d => d.Name.Equals(this.DocumentName, StringComparison.OrdinalIgnoreCase)))
    {
        foreach (Author author in doc.Authors)
        {
            TreeNode treeNode = new TreeNode()
            {
                Text = author.Name,
                Type = NodeType.ParentNode,
                Tag = author
            };

            foreach (Book book in author.Books)
            {
                treeNode.Nodes.Add(new TreeNode()
                {                    
                    Text = book.Name,
                    Type = NodeType.ChildNode,
                    Tag = book
                });
            }

            this.treeView.Nodes.Add(treeNode);
        }
    }
}


1239
4
задан 11 октября 2011 в 11:10 Источник Поделиться
Комментарии
2 ответа

Вы можете сделать это более ремонтопригодны и более компактным за счет использования технологии LINQ здесь. Я не уверен, что treenode, которая находится в коде, я предполагаю, что вы выведены из приложения WinForms объект treenode.

Я бы сказал, что узла типа ненужно. Вы можете легко определить, если посмотреть на его уровень. Уровень 0 означает, он находится в корне дерева, в противном случае это больше, чем 0.

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

Здесь я хотел сгладить вложенных циклов так далеко, как тогда я могу перебрать, чтобы добавить их к дереву. Сжать его еще больше, создайте фабричный метод для создания узлов. Даже более полезно, если у вас есть много свойств, чтобы установить.

// create the node for the item
static TreeNode CreateNode<T>(T item, Func<T, string> textSelector)
{
return new TreeNode { Text = textSelector(item), Tag = item };
}

var authors =
from plan in this.IncomingPlan.Plans
from doc in plan.Documents
where doc.Name.Equals(this.DocumentName, StringComparison.OrdinalIgnoreCase)
from author in doc.Authors
select author;

foreach (var author in authors)
{
var authorNode = CreateNode(author, a => a.Name);

foreach (var book in author.Books)
{
authorNode.Nodes.Add(CreateNode(book, b => b.Name));
}

treeView.Nodes.Add(authorNode);
}

2
ответ дан 11 октября 2011 в 09:10 Источник Поделиться

Прекрасно выглядит нормально для меня. Это первый раз, когда я посмотрел на ваш код, и я смог сразу же понять, что он делает.

Нет необходимости чрезмерно компактные вещи, если он собирается сделать это боль для кого-то другого, чтобы разобраться в будущем.

4
ответ дан 11 октября 2011 в 01:10 Источник Поделиться