首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将项目从列表中删除并重新排列。

将项目从列表中删除并重新排列。
EN

Stack Overflow用户
提问于 2022-09-19 00:02:21
回答 2查看 86关注 0票数 -1

我有一个列表,其中包含string的order属性。

这就是数据的样子:

代码语言:javascript
运行
复制
1
2
    2.1
        2.1.1
        2.1.2
    2.2
        2.2.1
        2.2.2
3
    3.1
    3.2
    3.3
4

班级结构是这样的

代码语言:javascript
运行
复制
public class CMNavBarDefaultDto
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string? Description { get; set; }
    public string? Comments { get; set; }
    public string Order { get; set; }
    public bool ToShowGray { get; set; }
    public bool IsNew { get; set; }
}

如果用户从列表中删除任何订单,就像用户删除3.1一样,那么3.2和3.3重新排列3.2就变成3.1,3.3变成3.1,如果用户删除任何像1这样的父级,那么所有的层次结构都应该以新的形式保持,比如2变得1,其子和子子应该从1开始。

有人能向我建议什么方法在这种情况下是有帮助的吗?

EN

回答 2

Stack Overflow用户

发布于 2022-09-19 01:23:47

在我看来,最好的方法是根据需要使用uint列表来指定级别。然后,您可以将html表与Order对象并行,以便根据需要更新表,方法是让delete操作实际修改Order,然后再更新html表。

问题是,如果用户删除了中间级别,该怎么办?例如,如果用户按以下顺序删除1.1,那么1.1.1和1.1.2会发生什么情况?

代码语言:javascript
运行
复制
1
  1.1
    1.1.1
    1.1.2
  1.2

它会变成下面的样子吗?

代码语言:javascript
运行
复制
1
  1.1
  1.2
  1.3 (was 1.2)

了解这些规则后,您可以创建一个转换函数来创建并行顺序,然后根据需要对其进行操作。下面的代码假设所有先前的级别都是随着您的深入而定义的(也就是说,如果您有一个级别2,则假设先前的级别是2或1)。在任何时候,您都可以跳过级别(即,您可以在第4级,然后有下一级)。如果不遵循这些规则,ToString函数将抛出异常。

代码语言:javascript
运行
复制
public class Order
{
    var list = new List<unit>();

    // needed: static function or constructor that takes html table string and returns Order and methods to modify Order

    public override string ToString()
    {
        var sb = new StringBuilder();
        var stack = Stack<(uint, string))>();
        uint current = 0;
        string order = "";
        foreach (var next in list)
        {
            if (next > stack.Count)
            {
                // next is in deeper level, make sure prior level(s) exist.
                if ((current == 0) || (next != (stack.Count + 1))) throw new Exception("missing level");

                // prior level(s) exist, push current level in stack in case lower level needed later, then restart count within next level
                stack.Push((current, order));
                order = $"{order}{current}.";
                current = 0;
            }
            else if (next < stack.Count)
            {
                // at lower level! pop out levels from stack until we get back to next level
                while (stack.Count > next)
                {
                    (current, order) = stack.Pop();
                }
            }

            // append next level to output
            current++;
            sb.AppendLine($"{order}{current}");
        }
        return sb.ToString();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2022-09-19 02:36:01

下面将创建树。您必须添加代码才能在树中添加和删除项。添加或删除时,必须对项目重新编号。

代码语言:javascript
运行
复制
using System;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Generic;


namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            List<CMNavBarDefaultDto> list = new List<CMNavBarDefaultDto>()
            {
                new CMNavBarDefaultDto() { Order = "1"},
                new CMNavBarDefaultDto() { Order = "2"},
                new CMNavBarDefaultDto() { Order = "2.1"},
                new CMNavBarDefaultDto() { Order = "2.1.1"},
                new CMNavBarDefaultDto() { Order = "2.1.2"},
                new CMNavBarDefaultDto() { Order = "2.2"},
                new CMNavBarDefaultDto() { Order = "2.2.1"},
                new CMNavBarDefaultDto() { Order = "2.2.2"},
                new CMNavBarDefaultDto() { Order = "3"},
                new CMNavBarDefaultDto() { Order = "3.1"},
                new CMNavBarDefaultDto() { Order = "3.2"},
                new CMNavBarDefaultDto() { Order = "3.3"},
                new CMNavBarDefaultDto() { Order = "4"},
            };

            Tree root = new Tree();
            root.MakeTree(list, root);
        }
    }
    public class CMNavBarDefaultDto
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string? Description { get; set; }
        public string? Comments { get; set; }
        public string Order { get; set; }
        public bool ToShowGray { get; set; }
        public bool IsNew { get; set; }
    }
    public class Tree 
    {
        public CMNavBarDefaultDto cmNav { get; set; }
        public int[] orderInt { get; set; }
        public List<Tree> children { get; set; }

        public void MakeTree(List<CMNavBarDefaultDto> cmNavs, Tree parent)
        {
            List<Tree> list = new List<Tree>();
            foreach(CMNavBarDefaultDto cmNav in cmNavs)
            {
                Tree node = new Tree() { cmNav = cmNav, orderInt = cmNav.Order.Split(new char[] { '.' }).Select(x => int.Parse(x)).ToArray() };
                list.Add(node);
            }
            int level = 0;
            list = list.OrderBy(x => x.orderInt.Length).ToList();
            MakeTreeRecursive(list, parent, level);
        }
        public void MakeTreeRecursive(List<Tree> list, Tree parent, int level)
        {
            var groups = list.GroupBy(x => x.orderInt[level]).ToList();
            foreach(var group in groups)
            {
                if (parent.children == null) parent.children = new List<Tree>();
                parent.children.Add(group.First());
                if (group.Count() > 1)
                {
                    if (group.Last().orderInt.Length == level + 1)
                    {
                        group.First().children = new List<Tree>();
                        group.First().children = group.Skip(1).ToList();
                    }
                    else
                    {
                        MakeTreeRecursive(group.Skip(1).ToList(), group.First(), level += 1);
                    }
                }
            }
        }

    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73767156

复制
相关文章

相似问题

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