Улучшить мою задачу петли


Как я могу улучшить этот код?
Это нормально писать код через вызов и действие так обильно или это плохо?

Производительность не является проблемой, так как я не использую вызов 50,000 X в ряд (много других вещей будет выполнена в-Между, что делает эффект нулевой).

Основной целью является, чтобы запустить мой список задач либо элемента первого или задачи. Вторичная цель-не писать массово длинный способ, где каждый метод пишется в каждом случае они могут быть завершены. При этом добавление новых задач позже намного легче.

Код: (обновлены с псевдо статисты)

public class TaskObject
{
    public bool RunPerItem = true; //PLACEHOLDER, normally derived externally from view model
    public bool RunPerTask = false; //PLACEHOLDER, normally derived externally from view model

    public Dictionary<string, Item>() TaskItems = new Dictionary<string, Item>()
    {
        { "ItemA", new Item() {} }, 
        { "ItemB", new Item() {} }, 
        { "ItemC", new Item() {} }, 
    }   

    private List<Action<TaskObject, Item>> Tasks = new List<Action<TaskObject, Item>>()
    {
        (TO, I) => { TO.TaskA(I); },
        (TO, I) => { TO.TaskB(I); },
        (TO, I) => { TO.TaskC(I); }
    };

    public void RunTasks()
    {
        //RunPerItem & RunPerTask are type `bool`
        if (this.RunPerItem) 
        {
            foreach (var I in this.TaskItems)
            {
                foreach (var T in this.Tasks)
                {
                    T.Invoke(this, I.Value); 
                }
            }
        }
        else if (this.RunPerTask)
        {
            foreach (var T in this.Tasks)
            {
                foreach (var I in this.TaskItems)
                {
                    T.Invoke(this, I.Value); 
                }
            }
        }
    }  

    public void TaskA(Item I) { /*...*/ }
    public void TaskB(Item I) { /*...*/ }
    public void TaskC(Item I) { /*...*/ }
}

public class Item 
{
    public string ItemName { get; set; }
} 

Спасибо за любые советы/помощь!!!

Редактировать/Пояснения/Дополнительная Информация:

Код, приведенный выше, описывает 2 различных петель с разных заказов на выполнение задачи.

Пример Заказов:
это.RunPerItem
Итема
-Таска
-TaskB
-TaskC

ItemB
-Таска
-TaskB
-TaskC

это.RunPerTask
Итема
-Таска

ItemB
-Таска



2126
4
задан 27 июля 2011 в 12:07 Источник Поделиться
Комментарии
3 ответа

Я не знаю, если вы можете, в зависимости от вашего реального мира должен... но если вы можете конвертировать TaskItems Словарь Список KeyValuePairs такой...

public List<KeyValuePair<string, Item>> TaskItems = new List<KeyValuePair<string, Item>>
{
new KeyValuePair<string, Item>( "ItemA", new Item() {} ),
new KeyValuePair<string, Item>( "ItemB", new Item() {} ),
new KeyValuePair<string, Item>( "ItemC", new Item() {} ),
};

Затем вы можете использовать командлет foreach() метод наращивания ресниц, чтобы уменьшить код цикла...

if (this.RunPerItem) 
{
TaskItems.ForEach(I => Tasks.ForEach(T => T(this, I.Value)));
}
else if (this.RunPerTask)
{
Tasks.ForEach(T => TaskItems.ForEach(I => T(this, I.Value)));
}

Если вы пара, которая с идеей @Стивен Jueris' разбивая их на их же методами, ваш код будет очень чистым.

4
ответ дан 28 июля 2011 в 01:07 Источник Поделиться

Вместо вызова делегатов с помощью вызова вы можете вызвать их с помощью следующей упростить форматирование:

Action someAction = () => {};
someAction();

Вызовы делегата не намного медленнее, чем обычный вызов метода. Не нужно беспокоиться о производительности.

1
ответ дан 28 июля 2011 в 12:07 Источник Поделиться

Простая вещь, что я вижу, это для читабельности я бы место внутри каждого топ-КСФ в отдельный метод с четким названием. И я всегда сразу же возвращался (часто сам способ) тогда вам не нужен другой (второй, если).

public void RunTasks()
{
if (this.RunPerItem)
{
return RunTasksForEachItem();
}

return RunEachTask();
}

0
ответ дан 28 июля 2011 в 12:07 Источник Поделиться