首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将列表解压到子对象。

将列表解压到子对象。
EN

Stack Overflow用户
提问于 2017-08-10 08:01:23
回答 1查看 459关注 0票数 0

编辑:我意识到我好像马上就来找答案了。我试着自己去做,但我开始相信有一个技工我不完全理解。我就是不能对这个问题全神贯注!

edit2:我用词不当!对于“父母”和“孩子”,我不使用"DOM“的意思!下面是用于我当前开发的HTML

代码语言:javascript
复制
<body>
    <h1>FIRST LEVEL TITLE</h1>
    <h4>test</h4>
    <h2>SECOND LEVEL TITLE</h2>
    <h3>THIRD LEVEL TITLE</h3>
    <h4>test</h4>
    <h3>THIRD LEVEL TITLE</h3>
    <h3>THIRD LEVEL TITLE</h3>
    <h2>SECOND LEVEL TITLE</h2>
    <h3>THIRD LEVEL TITLE</h3>
    <h3>THIRD LEVEL TITLE</h3>
    <h4>test</h4>
    <h4>test</h4>
</body>

我想要创建的“父”和“子”层次结构纯粹是虚拟的(只存在于我的库中,而不是HTML中)!我的标题标签不是嵌套的

使用Bridge.NET和Bridge.JQuery,我成功地从HTML (h1、h2等)中检索了完整的标题标签列表,并将它们存储在一个平面列表中。现在我尝试给这个列表一个层次结构,这样我的列表中的每个元素都有一个属性“子”,它包含所有在它们下面的元素,这些子元素包含其他子元素.

如果元素与预期的父元素之间没有中间级元素,则元素是直接子元素。

H2,H3,H4,

H4是H3的孩子,后者是H2的孩子。但在H2,H4,H3,

H3和H4是H2的孩子

示例:

代码语言:javascript
复制
H1 - FIRST LEVEL TITLE
H4 - test
H2 - SECOND LEVEL TITLE
H3 - THIRD LEVEL TITLE
H4 - test
H3 - THIRD LEVEL TITLE
H3 - THIRD LEVEL TITLE
H2 - SECOND LEVEL TITLE
H3 - THIRD LEVEL TITLE
H3 - THIRD LEVEL TITLE
H4 - test
H4 - test

变成了

代码语言:javascript
复制
H1 - FIRST LEVEL TITLE
--->H4 - test
--->H2 - SECOND LEVEL TITLE
--->--->H3 - THIRD LEVEL TITLE
--->--->H4 - test
--->--->--->H3 - THIRD LEVEL TITLE
--->--->--->H3 - THIRD LEVEL TITLE
--->H2 - SECOND LEVEL TITLE
--->--->H3 - THIRD LEVEL TITLE
--->--->H3 - THIRD LEVEL TITLE
--->--->H4 - test
--->--->H4 - test

平面列表中的每一个标题定义如下(任何修改都可以帮助实现我想要的)

代码语言:javascript
复制
internal class Title
{
    public TitleLevel Level { get; set; }
    public string Value { get; set; }
    public IEnumerable<Title> Children { get; set; }  

    /* removed irrelevant code */
}

internal enum TitleLevel
{
    H6,
    H5,
    H4,
    H3,
    H2,
    H1,
    DummyValue // exists for technical reasons, I may ask for advice on that later
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-21 09:50:55

所以,这是我想要的解决方案(不把清单弄平)。

代码确实不是很漂亮,但它有效。

它是这样的

代码语言:javascript
复制
var hierarchyList = GetTitleHierarchy(flatList);

这就是定义

代码语言:javascript
复制
/// <summary>
/// Turns a flat list of titles into a list where each element contains a list of it children, themselves containing a list of childre, ...
/// </summary>
/// <param name="titles">A flat list of titles</param>
/// <returns>A "cascading" list of titles</returns>
internal List<Title> GetTitleHierarchy(List<Title> titles)
{
    return PutInParent(titles);
}

private List<Title> PutInParent(List<Title> titles)
{
    var output = new List<Title>();

    for (int i = 0; i < titles.Count; i++)
    {
        // Copy because if passed by reference we'll get loop-referencing
        var title = titles.Get(i).Copy();

        var childrenCount = CountChildren(titles, i);
        if (childrenCount > 0)
        {
            var subItems = titles.GetRange(i + 1, childrenCount);
            title.Children = PutInParent(subItems);
        }

        output.Add(title);
        i += childrenCount;
    }

    return output;
}

/// <summary>
/// Returns the number of titles after the current index that should be children of the current element
/// </summary>
/// <param name="titles">the flat list of elements</param>
/// <param name="startIndex">the current position in the list</param>
/// <returns></returns>
internal int CountChildren(List<Title> titles, int startIndex)
{
    var clidrenCount = 0;

    foreach (var title in titles.Skip(startIndex + 1))
    {
        if (title.IsLevelLowerThan(titles.Get(startIndex).Level))
            break;

        clidrenCount++;
    }

    return clidrenCount;
}

internal class Title
{
    public TitleLevel Level { get; set; }
    public string Value { get; set; }
    public IEnumerable<Title> Children { get; set; }

    #region Overrides of Object

    public override string ToString()
    {
        return $"{Level} - {Value}";
    }

    #endregion

    public Title Copy()
    {
        return new Title
        {
            Level = Level,
            Value = Value,
            Children = Children.Select(c => c.Copy())
        };
    }

    public bool IsLevelLowerThan(TitleLevel targetLevel)
    {
        return (int) Level <= (int) targetLevel;
    }
}

internal enum TitleLevel
{
    H1 = 1,
    H2 = 2,
    H3 = 3,
    H4 = 4,
    H5 = 5,
    H6 = 6,
    DummyValue = 0
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45607788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档