2015-02-19 3 views
1

У меня есть очередь, которая содержит список делегатов, которые соответствуют методам, которые я хочу запустить в будущем. Я хотел бы иметь только особые экземпляры любого конкретного метода/параметра в очереди. Другими словами, очередь 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; 
} 
+0

Является ли число типов делегатов известных, или это должно обрабатывать произвольное N число делегатов добавив тот же метод? – Didaxis

ответ

1

Поскольку каждый раз, когда вы звоните QueueOne или QueueTwo, вы создаете новую функцию, которая передается в функцию очереди, у меня есть сомнения, что вы можете найти способ, чтобы сравнить их друг с другом и определить, что они совпадают ,

Это заставляет меня рекомендовать вам передать идентификатор, который вы будете использовать для сравнения уникальности.

В моем примере ниже я решил сделать это с помощью 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; 
} 
+0

У меня были и мои сомнения, но если вы проверите код и оставьте DoOne дважды, вы увидите, что он правильно отклонит второй проход. Не уверен, что это была случайность или стандартное поведение. В любом случае, что-то вроде этого было на самом деле тем, что я представлял, как выглядит резервное решение. Спасибо. – cubesnyc

0

Поскольку вы вызываете с параметром они обрабатывают различные объекты (см затворами C#)

Измените свой logicto проверить дублирования на:

если (_queue.Where (х => x.Method == Method.Method) .Any()) _queue.Enqueue (m);

это поможет вам остановить снова (даже если они имеют Diff параметров)

+0

это не сработает ... – Didaxis

+0

на каком основании вы прокомментировали ??? Я проверил этот код. – Bineesh

+0

И если вы заявляете 2 одинаковых funcs,() => 1, вы говорите мне, что вызов '.Method' дает вам одинаковый результат в обоих случаях? Думаю, нет. – Didaxis

Смежные вопросы