方法队列委托比较

时间:2015-02-19 22:06:50

标签: c# delegates

我有一个Queue,其中包含与我希望将来运行的方法相对应的委托列表。我想在队列中只有任何特定方法/参数的单个实例。换句话说,DoOne(),DoTwo(2),DoThree(3)的队列应该是可能的,因为不应该允许DoOne(),DoTwo(2),DoTwo(2)的队列。

我注意到_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;
}

2 个答案:

答案 0 :(得分:1)

因为每次调用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;
}

答案 1 :(得分:0)

由于您使用参数调用它们会被视为不同的对象(请参阅c#中的闭包)

更改逻辑以检查复制到:

if(!_queue.Where(x =&gt; x.Method == Method.Method).Any())                 _queue.Enqueue(米);

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