21

I have a list of method that I would like to call in a specific order. Therefore I would want to store them either in an ordered list or in a table with a specified index. This way the list would be the only thing to change the day we want to change the call order.

I found this article explaining how to do it using an array and delegates. But I read in the comments and some other places that it could also be done using a Dictionary and or LinQ. Any advices ?

Jla
  • 11,304
  • 14
  • 61
  • 84

5 Answers5

40

You can define Action objects, which are parameterless delegates that return void. Each action is a pointer to a method.

// Declare the list
List<Action> actions = new List<Action>();

// Add two delegates to the list that point to 'SomeMethod' and 'SomeMethod2'
actions.Add( ()=> SomeClass.SomeMethod(param1) );
actions.Add( ()=> OtherClass.SomeMethod2() );

// Later on, you can walk through these pointers
foreach(var action in actions)
    // And execute the method
    action.Invoke();
Jan Jongboom
  • 26,598
  • 9
  • 83
  • 120
8

How about a Queue<Action> ?

var queue = new Queue<Action>();

queue.Enqueue(() => foo());
queue.Enqueue(() => bar());

while(queue.Count != 0)
{
    Action action = queue.Dequeue();
    action();
}
abatishchev
  • 98,240
  • 88
  • 296
  • 433
4

Why don't you consider using a Queue it's FIFO , store delegates in Queue and when you call Dequeue it will call your methods in a specified manner.

What about using Multicast Delegate , it stores delegates in a LinkList, so when you call Invoke() , it will be called in a specified manner.

TalentTuner
  • 17,262
  • 5
  • 38
  • 63
0

I would advise to look at Command pattern. Hope it 's what you lookng for.

Arseny
  • 7,251
  • 4
  • 37
  • 52
0

You could use List<> which would fit your need pretty well:

delegate void MyFunction(...);
List<MyFunction> delegateList;

If your delegate returns void, you can use event. Multiple delegates can be added to a single event invocation list and will be called in the order they were added.

delegate void MyEvent(...);
event MyEventEventHandler MyEvent;

Dictionary order is undefined and it's meant to make a lookup.

Wernight
  • 36,122
  • 25
  • 118
  • 131