У меня есть система, где люди могут прислать мне List<ProductCategory>
.Сортировка списка по родительским/дочерним отношениям, поэтому я определенно обработал родителя, прежде чем пытаюсь обработать ребенка.
Мне нужно сделать некоторое сопоставление с моей системой, а затем сохранить их в базе данных.
входящие данные в этом формате:
public string ExternalCategoryID { get; set; }
public string ExternalCategoryName { get; set; }
public string ExternalCategoryParentID { get; set; }
Входящий список в произвольном порядке. Если ExternalCategoryParentID
имеет значение null, то это категория верхнего уровня. Родительские отношения с дочерними элементами могут быть любой глубиной - то есть технологией> телевизорами> Samsung> 3D> 40 "> и т. Д.> И т. Д.
Когда я спасаю, мне нужно убедиться, что я уже сохранил родителя - я не могу сэкономить Телевизоры до тех пор, пока я не сохраню технологию. ExternalCategoryID
, скорее всего, будет int, но это не имеет отношения к родительским отношениям с дочерними элементами (родитель может иметь более высокий или более низкий идентификатор, чем ребенок).
Как заказать этот список поэтому я могу пройти через него и быть уверенным, что для любого ребенка я уже обработал его родитель.
Единственный способ, которым я могу думать, это получить все, где ExternalCategoryParentID == null
, а затем получить все, где ExternalCategoryParentID
находится в этом списке «Верхний уровень», затем получает следующий набор детей ... и т. Д., Но это не может быть лучшим решением. Я бы предпочел сначала отсортировать, а затем обработать один цикл. Я нашел сообщение this, но он полагается на createdDate
, что не имеет отношения ко мне.
Вы выполняете так называемую «топологическую сортировку на направленном ациклическом графе». Из введения к алгоритмам Томас Кормен: «... Еще один способ выполнить топологическую сортировку на направленном ациклическом графе - это многократно найти вершину степени 0, вывести ее и удалить ее и все ее исходящие ребра из графика «. Так или иначе, вы будете делать повторные звонки. –