user2206329
user2206329

Reputation: 2842

how to transform the following in C#?

I have the following model

public class Node
    {
        public int AutoIncrementId { get; set; }


        public string Text { get; set; }


        public List<Node> Nodes { get; set; }

          ...//other propeties

     }

I want to transform the data into the following model,

public class TreeView
{    
 public int Id {get; set;}
 public string Text {get; set;}
 public List<TreeView> Items {get; set;}    
}

I started with the following, but then realised how am I going to know when to stop?

the variable test holds the node data

var items = test.Data.Select(x => new TreeViewItemModel
   {
     Id = x.AutoIncrementId.ToString(),
     Text = x.Text,
     Items =   x.Nodes.Select(y=> new TreeViewItemModel(
     {

       Id =  y.AutoIncrementId.ToString(),
       Text =  y.Text,
       Items = //do I keep going? 

     }));    
  }    
);

Upvotes: 4

Views: 114

Answers (3)

Baldrick
Baldrick

Reputation: 11860

For clarity and simplicity, this works nicely:

public TreeView ConvertNode(Node rootNode)
{
    var tree = new TreeView
    {
        Id = rootNode.AutoIncrementId,
        Text = rootNode.Text,
        Items = new List<TreeView>()
    };

    if (rootNode.Nodes != null)
    {
        foreach (var node in rootNode.Nodes)
        {
            tree.Items.Add(ConvertNode(node));
        }
    }

    return tree;
}

Upvotes: 0

Aron
Aron

Reputation: 15772

I prefer this form.

public TreeView ConvertToTreeView(Node node)
{
    return new TreeView
            {

                Id = node.AutoIncrementId;
                Text = node.Text;
                Items = node.Nodes.Select(ConvertToTreeView).ToList()
            };
}

Edit: Yes Baldrick, I did :P and

public TreeView ConvertToTreeView(Node node)
{
    return new TreeView
            {

                Id = node.AutoIncrementId;
                Text = node.Text;
                Items = node.Nodes != null
                           ? node.Nodes.Select(ConvertToTreeView).ToList()
                           : new List<TreeView>()
            };
}

Just doesn't look as nice.

Upvotes: 0

Szymon
Szymon

Reputation: 43023

You can use recursion to do that:

public TreeView ConvertToTreeView(Node node)
{
    TreeView tv = new TreeView();

    tv.Id = node.AutoIncrementId;
    tv.Text = node.Text;
    if (node.Nodes != null && node.Nodes.Count > 0)
    {
        tv.Items = new List<TreeView>();
        node.Nodes.ForEach(x => tv.Items.Add(ConvertToTreeView(x)));
    }

    return tv;
}

Upvotes: 2

Related Questions