方法队列委托比较



我有一个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)

这将帮助您停止再次添加相同的方法(即使它们有不同的参数)

最新更新