c# - 更新分层编号
问题描述
我的应用程序中有以下类,其中包含如下分层数据:
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;
解决方案
只是一个想法,如您的要求,但将类包含到您的分层数据结构中会不会更容易,例如:
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
或递归调用。
推荐阅读
- jquery - 获取单选框内标签的名称
- asp.net - 什么是 obj/Debug/netcoreapp2.1/Razor 文件夹?
- excel - 为什么这个循环找不到我明显存在的文件?
- swift - Kotlin 是否支持像 swift 这样的可选构造函数?
- pandas - 按 3 列和日期范围合并 2 个数据框
- python - BeautifulSoup 如何使用 for 循环并提取特定数据?
- wordpress - WordPress 通过代理后面的 Docker - cURL 错误 7,没有路由到主机
- angular - 如何在 rxjs/operator 中使用 map
- python - “没有名为‘cv2’的模块”但已安装
- java - 日志记录不适用于 Spring boot 2.1.1 和 JDK 11 升级