Вы писали:
Я на самом деле пытаюсь получить список с полем LevelType определенного типа.
Что вы хотите, если у вас есть несколько HierarchyLevels
с этим LevelType
? А что вы хотите, если LevelType
?
вообще нет
HierarchyLevels
Предположим, что вам нужны все уровни HierarchyLevel с этим LevelType
. Если позже вам понадобится только первый или тот, который имеет определенную аббревиатуру (или что-то еще), вы всегда можете использовать .FirstOrDefault
или .Where
. и сделайте ToList
в конце.
Реализация его как функции расширения. См. Демистифицированные методы расширения
public static IEnumerable<HierarchyLevel> GetHierarchyLevelsWithLevelType(
this IEnumerable<HierarchyLevel> hierarchyLevels,
LevelType desiredLevelType)
{
foreach (var hierarchyLevel in hierarchyLevels)
{
if (hierarchyLevel.LevelType == desiredLevelType)
{ // found one!
yield return hierarchyLevel;
}
// using recursion: check all the Children
IEnumerable<HierarchyLevel> childrenWithDesiredLevelType = hierarchyLevel.Children
.GetHierarchyLevelsWithLevelType(desiredLevelType);
foreach(var childWithDesiredLevelType in childrenWithDesiredLevelType)
{
yield return childWithDesiredLevelType;
}
}
}
Из-за рекурсии все внуки, их дети и т. Д. Будут возвращены
использование:
var allSpecialHierarchies = myHierarchies.GetHierarchyLevelsWithLevelType(LevelType.Special);
// get the first:
var firstSpecialHierarchy = allSpecialHierarchies.FirstOrDefault();
// get the first three named "Shakespeare:
var threeShakesPeares = allSpecialHierarchies
.Where(hierarchyLevel => hierarchyLevel.Name == "Shakespeare")
.Take(3)
Для лучшего использования вы должны предоставить версию с параметром IQualityComparer<LevelType>
. Пусть эта функция вызовет эту функцию.
И хорошая задача: чтобы быть полностью совместимым с LINQ, создайте версию с предикатом, который возвращает тип T и средство сравнения равенства для этого типа T, чтобы вы могли иметь все уровни HierarchyLevel с определенным именем или аббревиатурой.