我有一个Queue,它包含一个委托列表,这些委托对应于我将来要运行的方法。我希望队列中只有任何特定方法/参数的奇异实例。换句话说,DoOne()、DoTwo(2)、DoThree(3。
我注意到_queue.Contains(Func<int>)通过了我所做的最低限度的测试,但我担心我是否遗漏了什么。这是否足以确定特定方法/参数是否已排队,以满足我试图实现的目标?
Queue<Func<int>> _queue = new Queue<Func<int>>();
void Queue(Func<int> Method)
{
if (!_queue.Contains(Method))
_queue.Enqueue(Method);
}
void QueueOne()
{
Queue( () => DoOne() );
}
void QueueTwo(int val)
{
Queue( () => DoTwo(val) );
}
void DoOne()
{
return 1;
}
void DoTwo(int val)
{
return val;
}
由于每次调用QueueOne或QueueTwo时,都会创建一个传递给Queue函数的新函数,因此我怀疑您能否找到一种方法来相互比较并确定它们是否匹配。
这让我建议您传递一个标识符,用于进行唯一性比较。
在下面的示例代码中,我选择使用CallerMemberName来标识调用函数的名称(即"QueueOne"或"QueueTwo"),并在队列仍有匹配条目的情况下拒绝将该项排入队列。
Queue<Tuple<string, Func<int>>> _queue = new Queue<Tuple<string, Func<int>>>();
void Queue(Func<int> method, [CallerMemberName] string caller = null)
{
if (!_queue.Any(v => v.Item1 == caller))
_queue.Enqueue(Tuple.Create(caller, method));
}
void QueueOne()
{
Queue(() => DoOne());
}
void QueueTwo(int val)
{
Queue(() => DoTwo(val));
}
int DoOne()
{
return 1;
}
int DoTwo(int val)
{
return val;
}
由于您使用参数进行调用,因此它们被视为不同的对象(请参见c#中的闭包)
更改您的逻辑以检查重复:
if(!_queue.Where(x=>x.Method==Method.Method).Any())_queue.排队(m)
这将帮助您停止再次添加相同的方法(即使它们有不同的参数)