我正在努力为此找到一个好的解决方案。找到孤立元素是相当直接的,但问题在于以这样一种方式存储它们,以便它们可以在以后轻松地合并回层次结构中。
我是以下具有多个实现的抽象类:
public abstract class FilterElement
{
public abstract string ID { get; }
public abstract IEnumerable<FilterElement> Children { get; set; }
public FilterElement Parent { get; set; }
}
我有两个FilterElement 层次结构-“主”(即主要结构)和“过滤器”。过滤器指向主元素中的元素——但是,如果这些主元素不存在,我希望创建第三个结构,即“孤儿”。
我正在努力做到这一点。虽然很容易识别孤立元素,但我不知道如何有效地存储它们。这是当前的解决方案:
注意:“GetFlatKey”根据其父项和子项返回元素的唯一键,“RecursiveSelect”有效地展平层次结构:
private IEnumerable<FilterElement> GetOrphanedFilterElements
(IEnumerable<FilterElement> filters,
IEnumerable<IFilterFileViewModel> visibleList)
{
var flattenedMasterList = visibleList.Cast<IFilterViewModel>()
.RecursiveSelect(f => f.Children)
.Select(x => x.GetFlatKey).ToList();
var orphanedFilterFiles = new List<FilterElement>();
foreach (var f in filters.RecursiveSelect(f => f.Children))
{
// Remove non orphaned files.
if (!flattenedMasterList.Contains(f.GetFlatKey))
{
orphanedFilterFiles.Add((f));
}
}
return orphanedFilterFiles;
}
这样做的问题是 orphanedFilterFiles 列表中的元素包含对其他元素的引用 - 例如,一个孤儿将有一个父,它可能有非孤儿。这使得很难合并回最终的层次结构,这是主要问题。
谁能帮我找到更好的解决方案,或者告诉我我做错了什么?