获取队列c#中某个元素的索引

本文关键字:元素 索引 队列 获取 | 更新日期: 2023-09-27 18:29:08

我在c#中有一个用户队列(电子邮件字符串)a,我想向用户发送他在该队列中的位置。

类似的东西;

Queue q = new Queue(32);
q.Enqueue(Session["email"].ToString());
    queue.IndexOf(email);

有什么想法吗?

感谢

获取队列c#中某个元素的索引

也许ListArray更适合这样的操作,但您可以尝试以下操作:

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

您可以使用扩展方法,比如:

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

队列不是使用IndexOf的正确类型,请查找List

不幸的是,您不能直接使用普通的旧.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),同时索引O(n)),您应该使用双链表

如果您想让用户知道元素后面有多少元素,只需在插入元素后返回当前queue.Count属性。每当你按下elemtn时,计数就会增加。如果弹出一个元素,则计数会减少。

使用QueueToArray()方法按照队列的顺序获取数组,然后找到要搜索的对象。不过,无论执行什么任务,都很有可能不需要使用传统的队列。

类似于:

Queue q = new Queue();
q.Enqueue("apple");
q.Enqueue("banana");
q.Enqueue("orange");
// get banana index:
return Array.IndexOf(q.ToArray(), "banana");

西班牙宗教裁判所

受Monty Python草图的启发,您可以浏览整个嫌疑人队列,并将每个项目排成一列。当你在做它的时候,你可以使用lambda函数来保持排队操作中的排队

//The queue
var inquisition = new Queue<string>();
    
//Suspects
inquisition.Enqueue("SUSPECT_A");
inquisition.Enqueue("SUSPECT_B");
inquisition.Enqueue("SUSPECT_C");
//Interrogation lambda function noting particular suspect before returned
Func<string, string> interrogate = (suspect) => {
    Console.WriteLine(suspect + (suspect.Equals("SUSPECT_B") ? " <---" : ""));
    return suspect;
};
    
//Processing each suspect in the list
for(var i=0;i<inquisition.Count;i++){
    inquisition.Enqueue(interrogate(inquisition.Dequeue()));
}

结果是一份嫌疑人名单,可疑的嫌疑人用箭头标记

SUSPECT_A
SUSPECT_B <---
SUSPECT_C

我知道这是一个旧线程,但与我相关。在我的情况下,Queue对象非常适合它要做的工作,但我有一个单独的进程来报告队列中对象的状态,我想报告每个排队项目的队列位置。这是我的解决方案,它说明了如何将队列转换为列表。一旦转换为列表,您也可以对其执行Linq查询。在这种情况下,我需要通过其状态属性找到一个导出对象:

Dim ExpQueueList As List(Of Export) = ExportQueue.ToList()
For Idx As Integer = 0 To ExportStatuses.Count - 1
    Dim Status As ExportStatus = ExportStatuses(Idx)
    'Find the export that this status belongs to in the queued export list
    Dim ExpObj As Object = (From E As Export In ExpQueueList Where E.Status Is Status Select E).FirstOrDefault()
    'If the export was found in the queue list, set the status text to indicate the position in the queue
    If ExpObj IsNot Nothing Then
        Status.StatusText = "In Queue to run - Queue Position: " & ExpQueueList.IndexOf(ExpObj)
    End If
    ExpObj = Nothing
    Status = Nothing
Next

由于您正在询问用户,他将始终是列表中的最后一个人,这意味着它将等效于queue.Count