Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重新排列位置项列表_C# - Fatal编程技术网

C# 重新排列位置项列表

C# 重新排列位置项列表,c#,C#,我有一个请求对象,其中包含批准者列表。审批人有姓名和审批职位 马修 标记 卢克 约翰 最终,一个请求将通过这个链,从马修开始,到约翰结束 我需要能够重新排序这些允许添加和删除如下所述 批准人可以是- 在特定位置添加-即在位置3添加Peter,在这种情况下,新订单将 马修 标记 彼得 卢克 约翰 删除-即删除标记,在这种情况下,新订单 马修 卢克 约翰 编辑-即您可以将John的位置更改为1,在这种情况下,新订单为 约翰 马修 标记 卢克 我提出了许多解决方案,但没有一个是特别优雅的 任何帮助都将

我有一个请求对象,其中包含批准者列表。审批人有姓名和审批职位

  • 马修
  • 标记
  • 卢克
  • 约翰
  • 最终,一个请求将通过这个链,从马修开始,到约翰结束

    我需要能够重新排序这些允许添加和删除如下所述

    批准人可以是-

    在特定位置添加-即在位置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);
            }
        }
    }