У меня есть объект запроса, который содержит список утверждающих. Утверждающий имеет имя и должность утверждающего.
В конечном итоге запрос будет проходить по этой цепочке, начиная с Мэтью и заканчивая Джоном.
Мне нужно изменить порядок этих разрешающих добавлений и удалений, как описано ниже.
Утверждающий может быть -
Добавлен в определенной позиции - т.е. Добавьте Петра в позицию 3, и в этом случае новый заказ будет
Удалить - т.е. Удалить отметку, в этом случае новый заказ
Отредактировано - то есть вы можете изменить позицию Джона на 1, и в этом случае новый порядок
Я придумал несколько решений, но ни одно из них не отличается особой элегантностью.
Любая помощь приветствуется





Поддержание свойства position - это боль, так как вам нужно внести множество модификаций, чтобы что-то изменить (сохраняя при этом все логично). Это также затрудняет эффективную сериализацию / десериализацию.
Разве вы не можете просто вывести позицию из позиции в List<T> или подобном? Тогда вы можете Add() до конца, Insert() до середины и Remove() откуда угодно. Чтобы переместить что-либо, вы просто Remove() это и Insert() в нужное положение?
Вот так (с форматированием для пробела):
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);
}
}
}
Насколько велики могут быть списки? List<T>, вероятно, будет самым простым представлением коллекции, но это означает, что копия требуется каждый раз, когда вы вставляете или удаляете из середины списка. «Редактирование» списка в основном означает удаление / вставку.
Итерация проста.
Альтернативой может быть LinkedList<T>, которая упрощает итерацию, а «вставить после», «вставить перед» и «удалить» дешевый если, который вы вешаете на LinkedListNode<T>, связанный с каждым из ваших утверждающих. Но нелегко сказать, что «этот рецензент теперь должен быть на позиции 3» - вам нужно будет пройти итерацию, чтобы сначала найти позицию 3 (или 2, во всяком случае). Если это случай «переместить этого утверждающего после этого», тогда это идеальный вариант.