Here is an alternative (and I affirm a more effective) approach to accepted as an answer.
List<DataItem> dataItems = GetDataItems();
IDictionary<string, int> sortOrder = new Dictionary<string, int>()
{
{"A", int.MaxValue},
{"A.A1", int.MaxValue-1},
{"A.A2", int.MaxValue -2},
{"A.B1", int.MaxValue-3},
};
dataItems.Sort((di1, di2) => sortOrder[di1.Path].CompareTo(sortOrder[di2.Path]));
, Sort() OrderBy() O (n * logn), n - dataItems. O (n * logn) . , , sortOrder, , IEnumerable .
join, , O (nm), m - sortOrder. , O (nm + nlogn).
, join, O (n * (m + logn)) ~ = O (n * logn) . join . , linq, linq.