You can use recursion to do something like this:
private IEnumerable<FlatData> FindAllParents(List<FlatData> all_data, FlatData child)
{
var parent = all_data.FirstOrDefault(x => x.Id == child.ParentId);
if (parent == null)
return Enumerable.Empty<FlatData>();
return new[] {parent}.Concat(FindAllParents(all_data, parent));
}
And use it like this:
int id = 4;
var child = elements.First(x => x.Id == id);
var parents = FindAllParents(elements, child).ToList();
This solution works, but if you have a large data set, then you should consider using a Dictionary<int,FlatData>
to make it it faster to fetch a FlatData
object given it's Id
.
Here is how the method would look like in this case:
private IEnumerable<FlatData> FindAllParents(Dictionary<int,FlatData> all_data, FlatData child)
{
if(!all_data.ContainsKey(child.ParentId))
return Enumerable.Empty<FlatData>();
var parent = all_data[child.ParentId];
return new[] {parent}.Concat(FindAllParents(all_data, parent));
}
And here is how you would use it:
var dictionary = elements.ToDictionary(x => x.Id); //You need to do this only once to convert the list into a Dictionary
int id = 4;
var child = elements.First(x => x.Id == id);
var parents = FindAllParents(dictionary, child).ToList();