using System.Collections.Generic;
public MyInfo(string one, string two){
public string Prop1 {get;set;}
public string Prop2 {get;set;}
public override string ToString(){
return $"MyInfo{{Prop1:\"{Prop1}\", Prop2:\"{Prop2}\"}},";
public class MyTreeNode {
public MyTreeNode(string text, object tag, bool czeched = false){
public ICollection<MyTreeNode> Nodes {get;set;} = new List<MyTreeNode>();
public bool Checked {get;set;}
public string Text {get;set;}
public object Tag {get;set;}
public static void Main()
var list = new List<MyTreeNode>();
list.Add(new("one", new MyInfo("one", "x:one"), true));
list.Add(new("two", new MyInfo("two", "x:two"), false));
var three = new MyTreeNode("three", new MyInfo("three", "x:3"), true);
three.Nodes = new List<MyTreeNode>{
new ("3a", new MyInfo("3a", "y:3a"), true),
new ("3b", new MyInfo("3b", "y:3b"), false),
new ("3c", new MyInfo("3c", "y:3c"), true),
new ("3d", new MyInfo("3d", "y:3d"), false)
var threeE = new MyTreeNode("3e", new MyInfo("3e", "y:3e"), false);
threeE.Nodes = new List<MyTreeNode>{
new ("3Ea", new MyInfo("3Ea", "y:3Ea"), true),
new ("3Eb", new MyInfo("3Eb", "y:3Eb"), false),
new ("3Ec", new MyInfo("3Ec", "y:3Ec"), true)
list.Add(new("four", new MyInfo("four", "x:four"), false));
list.Add(new("five", new MyInfo("five", "x:five"), true));
foreach(var info in GetSelectedInfo(list).ToList()){
Console.WriteLine("Done");
public static IEnumerable<MyInfo> GetSelectedInfo(ICollection<MyTreeNode> nodes){
foreach(MyTreeNode node in nodes){
if(node.Checked && node.Tag is MyInfo info) yield return info;
if(node.Nodes.Count==0) continue;
foreach(var subInfo in GetSelectedInfo(node.Nodes)){