2013-11-20 3 views
2

У меня есть оператор if в foreach, и мне было интересно, могу ли я вызвать другой метод в зависимости от того, какие элементы верны, без необходимости делать переключатель или инструкции для всех из них.Способы хранения в массивах

foreach (var item in buttons) 
{ 
    if(item.isClicked) 
     //call item method 
} 

кнопки не из класса Buttons

То, что я ищу, как
button[0] вызова метода start()
button[1] вызовы метода options()

Есть ли способ, что я могу сделать это ?

+0

Не могли бы вы показать последовательность утверждений 'if', которых вы хотели бы избежать? Пример кода, который у вас есть, слишком неясен. – dasblinkenlight

+1

Этот вопрос немного странный. Переключатель имел бы смысл с учетом этого метода перечисления. Однако более обычный подход должен был бы сделать это с помощью прослушивателей событий, прикрепленных к каждой кнопке. – AndySavage

ответ

2

Предполагая, что ваши кнопки не поддерживают должным образом events, я полагаю, что вы ищете delegate. Есть несколько способов сделать это, но самая очевидная вещь, которая приходит на ум, это что-то вроде этого:

Action[] actions = new Action[2]; // create an array of actions, with 1 action for each button 
actions[0] = start; 
actions[1] = options; 

... 

for(var i = 0; i < buttons.Length; i++) 
{ 
    if(buttons[i].isClicked) 
     actions[i](); 
} 
+0

В основном то же, что и мое. Не уверен, ответили ли мы на вопрос? ... –

+0

@Simon true, немного сложно точно сказать, что нужно OP. –

3

Вы могли бы сделать что-то вроде этого:

private void DoStuff(params Action[] methods) { 
    for (int i = 0; i < buttons.Length; i++) { 
     if (buttons[i].isClicked) { 
      methods[i](); 
      break; 
     } 
    } 
} 

Тогда, вы бы сказали:

DoStuff(start, options); 

Где start метод называется для первой кнопки, options для второго, x для n .. и т. д.

1

Есть несколько способов для достижения этой цели, которые, как вы используете на самом деле зависит от того, сколько доступа вы должны изменить класс ваших «кнопок» (что вы на самом деле не сказали нам, что это такое).

Вариант 1: Добавление нового члена в классе (при условии, что класс «кнопок» ваш собственный класс)
Измените свой класс, чтобы новый элемент, называемый Action или некоторое такое имя. Этот элемент будет Delegate (примечание: Вы можете использовать более конкретный тип, как Action<T>, если вы знаете, действие каждой кнопки имеет одинаковую сигнатуру методы После того как вы этот член заявил, вы можете легко назвать его псевдокод:..

public class MyButton { 
    public bool isClicked { get; } 
    public Delegate action { get; } 
} 

foreach (var item in buttons) { 
    if(item.isClicked) 
     ((Action)item.action)(); // assuming that your "action" is a method which returns nothing and takes no arguments, cast to a more appropriate type if needed 
} 

Вариант 2: сопоставить каждую кнопку с действием Аналогичный принцип для варианта 1, за исключением того, что вы не можете напрямую модифицировать класс поддержки, вам придется привязать действия к кнопкам после факта. Вы можете создать карту (или Dictionary<TKey,TValue> в C#), чтобы отобразить кнопки для их действий. Для этого создайте новый словарь и добавьте каждую кнопку в качестве ключа вместе с ее действием:

// Declared at class-scope 
private readonly Dictionary<MyButton,Delegate> _actions = new Dictionary<MyButton,Delegate>(); // I don't know what type 'buttons' is so I'm substituting it with "MyButton" 

// In some initializer for the class (i.e the constructor) 
_actions.Add(buttons[0], start) 
_actions.Add(buttons[1], options) 
// .. etc 

// Then your loop becomes something like: 
foreach(var item in buttons) { 
    if (item.isClicked && _actions.ContainsKey(item)) { 
     ((Action)_actions[item])(); 
    } 
} 
Смежные вопросы