首页 > 解决方案 > 更新分层编号

问题描述

我的应用程序中有以下类,其中包含如下分层数据:

Class A 
{
   string Id{get;set;}
   string Name{get;set;}
   string Order{get;set;}
   string ParentId{get;set;}
}
Class B 
{
   string Id{get;set;}
   string Name{get;set;}
   string Order{get;set;}
   string ClassAId{get;set;}
}
Class C 
{
   string Id{get;set;}
   string Name{get;set;}
   string Order{get;set;}
   string ClassBId{get;set;}
}

A 类的样本数据为

Id = "1.1"                   Id = "2.1"
Name = "SomeName"            Name = "Name2"
Order = 1                    Order = 1
ParentId = "1"               ParentId = 2

Id = "1.2"                   Id = "2.2"
Name = "Name2"               Name = "Name3"
Order = 2                    Order = 2
ParentId = "1"               ParentId = 2

B 类的样本数据将是

 Id = "1.1.1"                   Id = "2.1.1"
    Name = "SomeName"            Name = "Name2"
    Order = 1                    Order = 1
    ParentId = "1.1"               ParentId = 2.1

    Id = "1.2.1"                   Id = "2.1.2"
    Name = "Name2"               Name = "Name3"
    Order = 2                    Order = 2
    ParentId = "1.2"               ParentId = 2.1

同样对于 C 类,数据看起来像

Id = "1.1.1.1"                   Id = "2.1.1.1"
Name = "SomeName"            Name = "Name2"
Order = 1                    Order = 1
ParentId = "1.1.1"               ParentId = 2.1.1

现在,如果用户想要更新现有值之间的值,它应该工作的方式是,假设我为 A 类输入一个介于 1.2 和 1.3 之间的值,它应该首先创建一个名为 1.4 的新值,然后移动所有内容的 1.3 及其子级为 1.4(即,如果 1.3 有自己的子级,如 1.3.1 等和 1.3.1.1 等所有应分别重命名为 1.4.1 和 1.4.1.1 并且 1.3 应该没有任何层次结构空值。基本上在插入之间应该更新记录的完整层次结构。我能够通过找到当前 ID 并找到最大顺序并将其加 1 来正确生成下一个序列。我面临的问题是在插入和更新整体之间层次结构。任何想法都会有所帮助。下面是我为输入新值 Class A 编写的代码:

//找到最大订单,将其增加1并插入新记录。

var currentClass = listOfClassA.Where(x => x.Id = currentId).SingleOrDefault();
var maxOrder = listOfClassA.Max(x => x.Order);
var objClassA = new A();
objClassA.Order = maxOrder + 1;
objClassA.ParentId = currentClassA.ParentId;
objClassA.Name = "";
objClassA.Id = currentClassA.ParentId + "." + objClassA.Order;

标签: c#mongodbdynamichierarchical-data

解决方案


只是一个想法,如您的要求,但将类包含到您的分层数据结构中会不会更容易,例如:

class A 
{
   public string Id{get;set;}
   public string Name{get;set;}
   public string Order{get;set;}
   //this is the tricky one.
   public string ParentId{get;set;}
}

class B 
{
   public string Id{get;set;}
   public string Name{get;set;}
   public string Order{get;set;}
   public A ClassA{get;set;}
}

class C 
{
   public string Id{get;set;}
   public string Name{get;set;}
   public string Order{get;set;}
   public B ClassB{get;set;}
}

另一个想法:由于您的类非常相似,您还可以创建一个真正的层次结构,如下所示:

public class Foo
{
    public string Id{get;set;}
    public string Name{get;set;}
    public string Order{get;set;}

    public Foo Parent {get;set;}
    public Foo Child{get;set;}
}


扩展之前的想法,你会发现你已经创建了一个LinkedList,例如:

public class Foo
{
    public string Id{get;set;}
    public string Name{get;set;}
    public string Order{get;set;}
}

var list = new LinkedList<Foo>();


还有另一种选择:它tree更像是一种结构,我相信它被称为复合模式

public class Foo
{
    public string Id{get;set;}
    public string Name{get;set;}
    public string Order{get;set;}

    public Foo Parent {get;set;}
    public IEnumerable<Foo> Children{get;set;}
}

我希望它有所帮助。使用上述模式之一可以轻松生成分层 ID 字符串,例如1.2.3.4.e.t.c.,如果您甚至需要它;因为序列化整个事情也很容易。不过要注意循环引用;-)

其他操作,找到最大值或最小值也是非常可行的,使用SelectMany或递归调用。


推荐阅读