0

我正在努力为此找到一个好的解决方案。找到孤立元素是相当直接的,但问题在于以这样一种方式存储它们,以便它们可以在以后轻松地合并回层次结构中。

我是以下具有多个实现的抽象类:

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 列表中的元素包含对其他元素的引用 - 例如,一个孤儿将有一个父,它可能有非孤儿。这使得很难合并回最终的层次结构,这是主要问题。

谁能帮我找到更好的解决方案,或者告诉我我做错了什么?

4

0 回答 0