Получить индекс элемента внутри очереди c # - PullRequest
6 голосов
/ 25 марта 2012

У меня есть очередь пользователей (цепочка писем) a в c #, и я хочу отправить пользователю его местоположение в этой очереди.

что-то вроде;

Queue q = new Queue(32);

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

    queue.IndexOf(email);

Любые идеи?

спасибо

Ответы [ 7 ]

9 голосов
/ 25 марта 2012

Может быть, List или Array будет лучше для таких действий, но вы можете попробовать это:

queue.ToArray().ToList().IndexOf(email);
3 голосов
/ 25 марта 2012

Вы можете использовать метод расширения, например:

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;
}
1 голос
/ 25 марта 2012

К сожалению, вы не можете прямо использовать обычный старый объект .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)) вы должны использоватьдвойной список

1 голос
/ 25 марта 2012

Очередь не подходит для использования IndexOf, ищите Список

0 голосов
/ 11 октября 2014

Используйте метод Queue ToArray(), чтобы получить массив в порядке очереди, а затем найти искомый объект.Вполне вероятно, что вам не нужно использовать традиционную очередь для выполнения любой задачи, которую вы выполняете.

Что-то вроде:

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

// get banana index:
return Array.IndexOf(q.ToArray(), "banana");
0 голосов
/ 25 марта 2012

Если вы хотите указать пользователю, сколько элементов находится у его элемента, просто верните текущее свойство queue .Count после вставки его элементов. Всякий раз, когда вы нажимаете Elemtn, количество увеличивается. Если элемент извлечен, количество уменьшается.

0 голосов
/ 25 марта 2012

Поскольку вы ставите пользователя в очередь, он всегда будет последним человеком в списке, что означает, что он будет эквивалентен queue.Count.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...