C# 重新排列位置项列表
我有一个请求对象,其中包含批准者列表。审批人有姓名和审批职位C# 重新排列位置项列表,c#,C#,我有一个请求对象,其中包含批准者列表。审批人有姓名和审批职位 马修 标记 卢克 约翰 最终,一个请求将通过这个链,从马修开始,到约翰结束 我需要能够重新排序这些允许添加和删除如下所述 批准人可以是- 在特定位置添加-即在位置3添加Peter,在这种情况下,新订单将 马修 标记 彼得 卢克 约翰 删除-即删除标记,在这种情况下,新订单 马修 卢克 约翰 编辑-即您可以将John的位置更改为1,在这种情况下,新订单为 约翰 马修 标记 卢克 我提出了许多解决方案,但没有一个是特别优雅的 任何帮助都将
任何帮助都将不胜感激维护position属性是一件痛苦的事情,因为您需要进行大量修改以更改某些内容(同时保持所有内容的逻辑性)。这也使得高效地序列化/反序列化变得困难 您不能简单地从
列表中的位置
或类似位置推断位置吗?然后,您可以在末尾添加(),在中间插入(),从任何位置删除()。要移动某物,只需将其Remove()
和Insert()
移动到所需位置即可
与此类似(格式化为空格):
使用系统;
使用System.Collections.ObjectModel;
使用System.Linq;
//我只是在下面添加了一个更懒惰的“集合初始值设定项”,
//它需要一个Add(string)方法。。。
类集合:集合{
public void Add(字符串名称){Add(新审批人(名称));}
}
类请求{
公共请求(){Approvers=newapprovercollection();}
公共审批人集合审批人{get;private set;}
}
类别批准人{
公共审批人(字符串名称){name=name;}
公共字符串名称{get;set;}
}
静态类程序{
静态void Main(){
请求req=新请求{
批准人={“马修”、“马克”、“卢克”、“约翰”}
};
要求显示状态(“首字母”);
请求批准人。插入(2,新批准人(“彼得”);
请求显示状态(“插入的彼得”);
批准人标记=请求批准人。单个(x=>x.Name==“标记”);
请求批准人。删除(标记);
要求显示状态(“移除标记”);
Approver john=req.Approvers.Single(x=>x.Name==“john”);
请求批准人移除(john);
请求批准人。插入(0,john);
请求显示状态(“移动约翰”);
}
静态void ShowState(此请求,字符串标题){
Console.WriteLine();
Console.WriteLine(标题);
int pos=1;
foreach(请求中的审批人a.Approvers){
WriteLine(“{0}:{1}”,pos++,a.Name);
}
}
}
列表可能有多大?可能是集合的最简单表示形式,但这意味着每次在列表中间插入或删除时都需要一个副本。“编辑”列表基本上意味着删除/插入
这样迭代就简单了
另一种选择可能是——如果您坚持使用与每个审批人相关联的文档,那么这会使迭代变得简单,并且“在后面插入”、“在前面插入”和“删除”成本低廉。但是说“这个评论员现在应该在第3位”并不容易——你必须先迭代找到第3位(或者第2位)。如果是“将此批准人移到此批准人之后”的情况,那么这是理想的
using System;
using System.Collections.ObjectModel;
using System.Linq;
// I only added this to use a lazier "collection initializer" below,
// which needs an Add(string) method...
class ApproverCollection : Collection<Approver> {
public void Add(string name) { Add(new Approver(name)); }
}
class Request {
public Request() { Approvers = new ApproverCollection(); }
public ApproverCollection Approvers { get; private set; }
}
class Approver {
public Approver(string name) { Name = name; }
public string Name { get; set; }
}
static class Program {
static void Main() {
Request req = new Request {
Approvers = {"Mathew", "Mark", "Luke", "John"}
};
req.ShowState("Initial");
req.Approvers.Insert(2, new Approver("Peter"));
req.ShowState("Inserted Peter");
Approver mark = req.Approvers.Single(x => x.Name == "Mark");
req.Approvers.Remove(mark);
req.ShowState("Removed Mark");
Approver john = req.Approvers.Single(x => x.Name == "John");
req.Approvers.Remove(john);
req.Approvers.Insert(0, john);
req.ShowState("Moved John");
}
static void ShowState(this Request request, string caption) {
Console.WriteLine();
Console.WriteLine(caption);
int pos = 1;
foreach(Approver a in request.Approvers) {
Console.WriteLine("{0}: {1}", pos++, a.Name);
}
}
}