2008-10-27 8 views
5

J'ai un objet Demande qui contient une liste d'approbateurs. Un approbateur a un nom et une position d'approbation.Réorganisation d'une liste d'éléments positionnels

  1. Mathew
  2. Mark
  3. Luke
  4. John

En fin de compte, une demande se déplacera à travers cette chaîne, à partir de Mathew et se terminait à John.

Je dois être en mesure de réorganiser ces autorisant les ajouts et les suppressions comme indiqué ci-dessous.

Un approbateur peut être -

Ajouté à une certaine position - à savoir. Ajouter Peter à la position 3 dans ce cas, le nouvel ordre serait

  1. Mathew
  2. Mark
  3. Peter
  4. Luc
  5. John

Supprimer - à savoir. Supprimer la marque dans ce cas, le nouvel ordre est

  1. Mathew
  2. Luke
  3. John

Edité - dire que vous pouvez changer la position de John à 1 dans ce cas, le nouvel ordre est

  1. John
  2. Mathew
  3. Mark
  4. Luke

Je suis venu avec un certain nombre de solutions, mais aucun d'entre eux est particulièrement élégant.

Toute aide serait appréciée

Répondre

5

Quelle sont les listes susceptibles d'être? List<T> est susceptible d'être la représentation la plus facile de la collection, mais cela signifie qu'une copie est requise chaque fois que vous insérez ou supprimez du milieu de la liste. "Éditer" la liste signifie essentiellement une suppression/insertion.

L'itération est alors simple.

Une alternative pourrait être LinkedList<T> - ce qui rend l'itération simple et « insérer après », « insérer avant » et « supprimer » pas cher si vous accrochez la LinkedListNode<T> associée à chacun de vos approbateurs. Mais il n'est pas facile de dire "cet examinateur devrait maintenant être à la position 3" - vous devez parcourir pour trouver la position 3 d'abord (ou 2, de toute façon). Si c'est un cas de "déplacer cet approbateur après celui-ci", alors c'est l'idéal.

4

Le maintien d'une propriété de position est une douleur, comme vous devez faire beaucoup de modifications de changer quelque chose (tout en gardant tout logique). Il est également difficile de sérialiser/désérialiser efficacement.

Pouvez-vous simplement déduire la position à partir de la position List<T> ou similaire? Ensuite, vous pouvez Add() à la fin, Insert() au milieu et Remove() de n'importe où. Pour déplacer quelque chose vous simplement le Remove() et Insert() à la position que vous voulez?

Comme si (formaté pour l'espace):

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); 
     } 
    } 
} 
Questions connexes