2008-10-27 24 views
5

Tengo un objeto Solicitud que contiene una lista de Aprobadores. Un aprobador tiene un nombre y una posición de aprobación.Reordenar una lista de elementos posicionales

  1. Mathew
  2. Marcos
  3. Lucas
  4. John

En última instancia, la solicitud se moverá a través de esta cadena, a partir de Mathew y terminó a John.

Necesito poder volver a ordenar estas adiciones y eliminaciones como se describe a continuación.

Un aprobador puede ser -

Añadido en una posición determinada - es decir. Añadir Peter en la posición 3 en cuyo caso el nuevo orden sería

  1. Mathew
  2. Marcos
  3. Peter
  4. Lucas
  5. John

Eliminar - es decir. Eliminar Marcos en cuyo caso el nuevo orden es

  1. Mathew
  2. Lucas
  3. John

Editado - es decir, puede cambiar la posición de John a 1, en cuyo caso el nuevo orden es

  1. John
  2. Mathew
  3. Marcos
  4. Lucas

he llegado con una serie de soluciones, sin embargo ninguno de ellos es especialmente elegante.

Cualquier ayuda se agradece mucho

Respuesta

5

¿Qué tan grande es probable que sean las listas? List<T> es probable que sea la representación más fácil de la colección, pero significa que se requiere una copia cada vez que inserte o elimine del medio de la lista. "Editar" la lista significa básicamente eliminar/insertar.

La iteración es sencilla.

Una alternativa podría ser LinkedList<T> - que hace iteración simple y "insertar después de", "Insertar antes" y "borrar" barato si se cuelga en la LinkedListNode<T> asociado con cada uno de los aprobadores. Pero no es fácil decir que "este revisor debería estar ahora en la posición 3". Tendría que repetir para encontrar la posición 3 primero (o 2, de todos modos). Si se trata de "mover este aprobador después de este", entonces es ideal.

4

El mantenimiento de una propiedad de posición es un dolor, ya que tienes que hacer un montón de modificaciones para cambiar algo (manteniendo todo lógico). También hace que sea difícil serializar/deserializar de manera eficiente.

¿No puede inferir simplemente la posición desde la posición en un List<T> o similar? Luego puede Add() hasta el final, Insert() en el medio y Remove() desde cualquier lugar. Para mover algo, simplemente Remove() y Insert() en la posición que desee?

Al igual que (con formato de espacio):

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); 
     } 
    } 
} 
Cuestiones relacionadas