using System.Collections;
using System.Collections.Generic;
static void Main(string[] args)
var a = FindFleetId(TestA(), fleetId);
Console.WriteLine(x.Item1.ToString() + " | " + x.Item2.ToString());
var b = FindFleetId(TestB(), fleetId);
Console.WriteLine(x.Item1.ToString() + " | " + x.Item2.ToString());
var c = FindFleetId(TestC(), fleetId);
Console.WriteLine(x.Item1.ToString() + " | " + x.Item2.ToString());
var d = FindFleetId(TestD(), fleetId);
Console.WriteLine(x.Item1.ToString() + " | " + x.Item2.ToString());
private static IEnumerable<(object, object)> FindFleetId(object rootObj, int fleetId)
Enumerable.Empty<(object, object)>();
return Parse(rootObj, rootObj, fleetId);
private static IEnumerable<(object, object)> Parse(object rootObj, object currentObj, int fleetId)
var type = currentObj.GetType();
var enumerable = currentObj as IEnumerable;
if (enumerable != null && type != typeof(string))
foreach (var item in enumerable)
var newRootObj = object.ReferenceEquals(rootObj, currentObj) ? item : rootObj;
foreach (var nestedObj in Parse(newRootObj, item, fleetId))
var properties = type.GetProperties();
foreach (var propertyInfo in properties)
var propValue = propertyInfo.GetValue(currentObj);
if (propertyInfo.Name == "FleetId")
if (propValue is int fId && fId == fleetId)
yield return (rootObj, currentObj);
foreach (var nestedObj in Parse(rootObj, propValue, fleetId))
private static A1[] TestA()
new A1() {A2 = new A2() {A3 = new A3() {FleetId = 1}}},
new A1() {A2 = new A2() {A3 = new A3() {FleetId = 2}}},
private static B1[] TestB()
private static C1[] TestC()
new C1() { C2 = new List<C2>() { new C2() { C3 = new C3(){FleetId = 1}}}},
new C1() { C2 = new List<C2>() { new C2() { C3 = new C3(){FleetId = 2}}}},
private static D1[] TestD()
new D1() { D2 = new List<D2>() {new D2(){FleetId = 1}}},
new D1() { D2 = new List<D2>() {new D2(){FleetId = 2}}},
public A2 A2 { get; set; }
public override string ToString()
public A3 A3 { get; set; }
public override string ToString()
public int FleetId { get; set; }
public override string ToString()
public int FleetId { get; set; }
public override string ToString()
public List<C2> C2 { get; set; }
public override string ToString()
return "C1." + string.Join("|", C2);
public C3 C3 { get; set; }
public override string ToString()
public int FleetId { get; set; }
public override string ToString()
public List<D2> D2 { get; set; }
public override string ToString()
return "D1." + string.Join("|", D2);
public int FleetId { get; set; }
public override string ToString()