gpt4 book ai didi

c# - 在队列中查找特定操作的索引

转载 作者:太空宇宙 更新时间:2023-11-03 12:20:07 25 4
gpt4 key购买 nike

所以我正在制作一个 Action 队列,它可以随时调用,我需要的是获取每个 session 的队列位置。我试过执行 A Queue of Action,传递 session 名称,然后查找索引,但它总是返回 -1。

public static Queue<Action<string>> myQ = new Queue<Action<string>>();
static void Main(string[] args)
{
myQ.Enqueue((string i) =>
{
i = "First";
});
myQ.Enqueue((string i) =>
{
i = "Second";
});
myQ.Enqueue((string i) =>
{
i = "Third";
});
int index = myQ.ToList().IndexOf((string i) =>
{
i = "First";
});
Console.WriteLine(index);
Console.ReadLine();
}

最佳答案

List<T>.IndexOf方法在列表中搜索指定的对象。对于引用类型(Action<string> 是引用类型),项目通过引用相等性进行比较,即对象变量实际上应该引用相同的对象。

在你的例子中是一个新的 Action<string>每次指定时都会创建对象

(string i) =>
{
i = "First";
}

这就是为什么 IndexOf() 的原因调用返回 -1 .

最简单的解决方法是将相同的对象传递给 IndexOf()调用:

var firstAction = (string i) =>
{
i = "First";
};
myQ.Enqueue(firstAction);

// ...

int index = myQ.ToList().IndexOf(firstAction);

更灵活的方法是定义一个简单的类,将 session 名称作为您可以搜索的属性:

public class QueueItem
{
public string SessionName { get; }

public Action<string> Action => i => i = SessionName;

public QueueItem(string sessionName)
{
SessionName = sessionName;
}
}

Queue<QueueItem> myQ = new Queue<QueueItem>();
myQ.Enqueue(new QueueItem("First"));
myQ.Enqueue(new QueueItem("Second"));
myQ.Enqueue(new QueueItem("Thrid"));
int index = myQ.ToList().FindIndex(x => x.SessionName == "First");

您代码中的另一个问题是您如何使用 Action分配字符串变量。考虑这段代码:

string str = "One";
Action<string> action = x => x = "Two";
action(str);

执行此代码后,str 的值将是 "One" , 不是 "Two" .调用操作时,str按值传递,因此在操作(或任何其他方法)内对参数的任何赋值都不会影响其初始值。检查这个question了解更多详情。

你可以通过 Func<string> 来解决这个问题而不是 Action<string>并在赋值中使用返回值:

public class QueueItem
{
public string SessionName { get; }

public Func<string> Func => () => SessionName;

public QueueItem(string sessionName)
{
SessionName = sessionName;
}
}

Queue<QueueItem> myQ = new Queue<QueueItem>();
myQ.Enqueue(new QueueItem("First"));
myQ.Enqueue(new QueueItem("Second"));
myQ.Enqueue(new QueueItem("Thrid"));
var queueList = myQ.ToList();
int index = queueList.FindIndex(x => x.SessionName == "First");
var result = queueList[index].Func();

关于c# - 在队列中查找特定操作的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47757621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com