2008-10-27 53 views
5

Tôi có một đối tượng Yêu cầu có chứa danh sách các Người phê duyệt. Người phê duyệt có tên và vị trí phê duyệt.Sắp xếp lại một danh sách các mục vị trí

  1. Mathew
  2. Đánh dấu
  3. Luke
  4. John

Cuối cùng, một yêu cầu sẽ di chuyển qua chuỗi này, bắt đầu từ Mathew và kết thúc vào lúc John.

Tôi cần có thể sắp xếp lại những thứ này cho phép thêm và xóa như được nêu bên dưới.

Người phê duyệt có thể là -

Được thêm tại một vị trí nhất định - ví dụ: Thêm Peter ở vị trí 3 trong trường hợp trật tự mới sẽ

  1. Mathew
  2. Đánh dấu
  3. Peter
  4. Luke
  5. John

Xóa - tức. Xóa Đánh dấu trong trường hợp này theo thứ tự mới là

  1. Mathew
  2. Luke
  3. John

Chỉnh sửa - tức là bạn có thể thay đổi vị trí của John tới 1 trong trường hợp này theo thứ tự mới là

  1. John
  2. Mathew
  3. Đánh dấu
  4. Luke

tôi đã đưa ra một số giải pháp, tuy nhiên không ai trong số họ là đặc biệt thanh lịch.

Bất kỳ trợ giúp sẽ được nhiều đánh giá cao

Trả lời

5

Làm thế nào lớn là những danh sách có thể sẽ là? List<T> có thể là đại diện dễ dàng nhất của bộ sưu tập, nhưng nó có nghĩa là một bản sao được yêu cầu mỗi khi bạn chèn vào hoặc loại bỏ từ giữa danh sách. "Chỉnh sửa" danh sách về cơ bản có nghĩa là xóa/chèn.

Lặp lại sau đó đơn giản.

Một thay thế có thể là LinkedList<T> - mà làm cho lặp đơn giản và "chèn sau", "chèn trước" và "xóa" rẻ nếu bạn treo lên LinkedListNode<T> gắn liền với mỗi người phê duyệt của bạn. Nhưng nó không làm cho nó dễ dàng để nói "người đánh giá này bây giờ nên ở vị trí 3" - bạn sẽ phải lặp qua để tìm vị trí thứ 3 đầu tiên (hoặc 2, dù sao). Nếu đó là trường hợp "di chuyển người phê duyệt này sau lần này" thì đó là lý tưởng.

4

Duy trì một thuộc tính position là một nỗi đau, như bạn cần phải thực hiện nhiều thay đổi để thay đổi một cái gì đó (trong khi vẫn giữ tất cả mọi thứ logic). Nó cũng làm cho nó khó để serialize/deserialize hiệu quả.

Bạn có thể không đơn giản suy ra vị trí từ vị trí trong List<T> hoặc tương tự không? Sau đó, bạn có thể Add() đến cuối, Insert() ở giữa và Remove() từ bất kỳ đâu. Để di chuyển một cái gì đó bạn chỉ cần Remove() nó và Insert() nó ở vị trí bạn muốn?

Giống như (định dạng cho không gian):

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); 
     } 
    } 
} 
Các vấn đề liên quan