2012-03-25 55 views
6

我在c#中有一個用戶隊列(電子郵件字符串)a,我想向用戶發送他在這個隊列中的位置。獲取隊列c中元素的索引#

類似的東西;

Queue q = new Queue(32); 

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

    queue.IndexOf(email); 

任何想法?

感謝

回答

8

也許ListArray將是這種行動更好,但你可以試試這個:

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

這是一個可行的解決方案,但它更多地回答了這個問題:如何將隊列放入列表中,以便我可以調用IndexOf方法? – 2012-03-25 18:29:38

+1

事實上,隊列沒有提供返回索引的接口,所以這是一個妥協解決方案 – ionden 2012-03-25 18:35:07

+2

我很好,但是這需要第二個想法,如果可能的話 – 2012-03-25 18:36:36

-1

既然你的入隊用戶,他將永遠是最後一個人在列表中,這意味着將相當於queue.Count

+0

,不,不,我使用遠程腳本來更新當前位置,每隔幾個薄荷糖 – baaroz 2012-03-25 18:24:52

+0

@baaroz:那麼,如果你不看[這裏的東西(HTTP:// MSDN .microsoft.com/en-us/library/7977ey2c.aspx),那麼我們可以爲你做的事情並不多。您需要選擇不同的容器類型。 ionden是對的。無論如何,列表可以像隊列一樣使用。 – mpen 2012-03-25 18:34:55

0

如果你想讓用戶現在有多少元素是他的元素,只需在插入元素後返回當前隊列的.Count屬性即可。無論何時你推elemtn,計數都會增加。如果一個元素被彈出,計數會減少。

1

隊列是不正確的類型使用的IndexOf,查找列表

+0

我知道沒有IndexOf!它只是我想要做的一個例子 – baaroz 2012-03-25 18:29:04

+0

我的意思是,如果你需要一個集合,你需要知道元素在那個位置的位置收集,那麼Queue是錯誤的選擇。 @ionden回答瞭如何做到這一點,是正確的方式,但.. – 2012-03-25 18:31:31

1

不幸的是,你不能直接使用舊的.NET Queue對象。隊列是爲「盲」的先進先出邏輯而設計的,因此除了那個之外你不能執行其他任何事情。

如果你真的需要實現一個隊列中,你可以找到的元素,並檢索其位置(一個非常有用的東西)嘗試在公開以下方法的類來包裝的一切:

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++; 
     } 
    } 
} 

爲了更好地性能(排隊和出隊O(1),而的indexOf爲O(n)),你應該使用雙鏈表

3

您可以使用擴展方法是這樣的:

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

使用QueueToArray()方法按照隊列的順序獲取數組,然後找到要搜索的對象。很有可能你不需要使用傳統隊列來執行你正在執行的任何任務。

喜歡的東西:

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

// get banana index: 
return Array.IndexOf(q.ToArray(), "banana");