我正在努力为此找到一个好的解决方案。找到孤立元素是相当直接的,但问题是存储它们的方式可以在以后很容易地将它们合并回层次结构中。
我是以下具有多个实现的抽象类:
public abstract class FilterElement
{
public abstract string ID { get; }
public abstract IEnumerable<FilterElement> Children { get; set; }
public FilterElement Parent { get; set; }
}
我有两个FilterElement层次结构 - “主”(即主结构)和“过滤器”。过滤器指向主设备中的元素 - 但是,如果这些主要元素不存在,我希望创建第三个结构,即“孤儿”。
我正在努力做到这一点。虽然很容易识别出孤立的元素,但我不知道如何有效地存储它们。这是目前的解决方案:
注意:“GetFlatKey”会根据元素的父元素和元素返回元素的唯一键。 children和“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列表中的元素包含对其他元素的引用 - 例如孤儿将有一个父母,可能有非孤儿。这使得很难合并回最终层次结构,这是主要问题。
任何人都可以帮我找到更好的解决方案,或者只是告诉我我做错了什么?