2012-03-25 18 views
6

Tôi có hàng đợi người dùng (chuỗi email) a trong C# và tôi muốn gửi cho người dùng vị trí của anh ấy trong hàng đợi này.Lấy chỉ mục của phần tử bên trong hàng đợi C#

điều gì đó tương tự;

Queue q = new Queue(32); 

q.Enqueue(Session["email"].ToString()); 

    queue.IndexOf(email); 

Bất kỳ ý tưởng nào?

nhờ

Trả lời

8

Có lẽ một List hoặc một Array sẽ tốt hơn cho hành động như vậy nhưng bạn có thể thử điều này:

queue.ToArray().ToList().IndexOf(email); 
+0

Đây là một giải pháp làm việc, nhưng nó là một câu trả lời cho câu hỏi: Làm thế nào để đặt hàng đợi vào danh sách để tôi có thể gọi phương thức IndexOf? –

+1

Thật vậy, nhưng hàng đợi không cung cấp giao diện để trả lại chỉ mục vì vậy đây là giải pháp thỏa hiệp – ionden

+2

Tôi ổn, nhưng điều này cần suy nghĩ thứ hai, nếu có thể –

-1

Vì bạn đang enqueing người sử dụng, anh sẽ luôn là người cuối cùng trong danh sách, có nghĩa là nó sẽ tương đương với queue.Count.

+0

không không Tôi sử dụng kịch bản từ xa để làm mới vị trí hiện tại, mỗi vài bạc hà – baaroz

+0

@baaroz: Vâng, nếu bạn không thấy [một cái gì đó ở đây] (http: // MSDN .microsoft.com/en-us/library/7977ey2c.aspx), sau đó thực sự không có nhiều chúng tôi có thể làm cho bạn. Bạn cần chọn loại vùng chứa khác. ionden là đúng. 'Danh sách ' s có thể được sử dụng như hàng đợi anyway. – mpen

0

nếu bạn muốn cho người dùng biết có bao nhiêu phần tử đang xử lý phần tử của mình, chỉ cần trả về hàng đợi hiện tại .Count property, sau khi chèn các phần tử của mình. Bất cứ khi nào bạn đẩy một elemtn, số lượng được tăng lên. Nếu một phần tử xuất hiện, số lượng sẽ giảm.

1

Queue không phải là loại thích hợp để sử dụng IndexOf, tìm kiếm Danh sách

+0

Tôi biết không có IndexOf! Nó chỉ là ví dụ về những gì tôi đang cố gắng làm – baaroz

+0

Điều tôi muốn nói là nếu bạn cần một bộ sưu tập mà bạn cần biết vị trí của phần tử trong đó bộ sưu tập, sau đó Hàng đợi là lựa chọn sai. @ionden đã trả lời cách thực hiện, là đúng cách, nhưng .. –

1

Thật không may, bạn không thể sử dụng thẳng đối tượng .NET Queue cũ. Hàng đợi được thực hiện cho logic "mù" đầu tiên trong đầu tiên, để bạn không thể thực hiện bất cứ điều gì khác ngoài điều đó.

Nếu bạn thực sự cần phải thực hiện một hàng đợi trong đó bạn có thể tìm thấy các yếu tố và lấy vị trí của họ (một điều rất hữu ích) cố gắng quấn tất cả mọi thứ trong một lớp học mà đưa ra phương án sau:

public class CustomQueue<T> { 
    private LinkedList<T> fifoList = new LinkedList<T>(); 

    public Enqueue(T newItem) { 
     //add newItem at the head of fifoList 
    } 

    public T Dequeue() { 
     //return and remove the item that is located at the tail of the queue 
    } 

    public int indexOf(T searchFor) { 
     int ret = 0; 
     for (T item: fifoList) { 
      if (item.equals(searchFor)) return ret; 
      ret++; 
     } 
    } 
} 

Đối với tốt hơn hiệu suất (hàng đợi và dequeue O (1) trong khi indexOf O (n)), bạn nên sử dụng một danh sách liên kết kép

3

bạn có thể sử dụng phương pháp mở rộng, một cái gì đó như:

public static int IndexOf<T>(this IEnumerable<T> collection, T searchItem) 
{ 
    int index = 0; 

    foreach (var item in collection) 
    { 
     if (EqualityComparer<T>.Default.Equals(item, searchItem)) 
     { 
      return index; 
     } 

     index++; 
    } 

    return -1; 
} 
0

Sử dụng phương thức ToArray() của Queue để lấy một mảng theo thứ tự của hàng đợi, sau đó tìm đối tượng bạn đang tìm kiếm. Có một cơ hội tốt bạn không cần phải sử dụng một hàng đợi truyền thống cho bất cứ nhiệm vụ nào bạn đang thực hiện.

Cái gì như:

Queue q = new Queue(); 
q.Enqueue("apple"); 
q.Enqueue("banana"); 
q.Enqueue("orange"); 

// get banana index: 
return Array.IndexOf(q.ToArray(), "banana"); 
Các vấn đề liên quan