Почему мой анонимный метод не работает в цикле? - PullRequest
2 голосов
/ 14 января 2012

Предполагается, что эта функция устанавливает порядковые номера в IEnumerable , но она не работает. Может кто-нибудь сказать мне, что с ним не так?

private void orderNumberSetter(IEnumerable<Order> orders)
{
    var i = 0;            

    Action<Order, int> setOrderNumber = (Order o, int count) =>
    {
        o.orderNumber = i--;
    };

    var orderArray = orders.ToArray();
    for (i = 0; i < orders.Count(); i++)
    {
        var order = orderArray[i];
        setOrderNumber(order, i);
    }            
}

Ответы [ 4 ]

9 голосов
/ 14 января 2012

Вы повторно используете i в качестве переменной цикла, а i изменяется в вашей setOrderNumber лямбде - не изменяйте i - неясно, что вы намеревались сделать , может быть следующее:

Action<Order, int> setOrderNumber = (Order o, int count) =>
{
    o.orderNumber = count;
};

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

for (i = 0; i < orderArray.Length; i++)
{
    orderArray[i].orderNumber = i;
} 

или даже проще, не создавая массив вообще:

int orderNum = 0;
foreach(var order in orders)
{
   order.orderNumber = orderNum++;
}

Edit:

Чтобы установить номера по убыванию, вы можете сначала определить количество заказов, а затем вернуться назад:

int orderNum = orders.Count();
foreach(var order in orders)
{
   order.orderNumber = orderNum--;
}

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

int orderNum = 0;
foreach(var order in orders.Reverse())
{
   order.orderNumber = orderNum++;
}
2 голосов
/ 14 января 2012

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

IEnumerable<Order> reversed = orders.ToArray(); //To avoid editing the original
reversed.Reverse();
int orderNumber = 0; 
foreach (Order order in reversed)
{
    order.orderNumber = orderNumber++;
}

Я предлагаю отредактировать ваш заголовок. Ваш заголовок описывает ваш вопрос, и я уверен, что вы не хотели использовать функцию Broken C #, поскольку она у вас уже была: P. Также полезно подробно описать, что ваш код должен делать в посте, включая ожидаемые результаты и то, как ваш текущий пример не соответствует им. Не позволяйте вашему неработающему примеру объяснить, что вы хотите, он только показал нам пример того, чего вы не хотели.

2 голосов
/ 14 января 2012

Я бы попробовал этот код вместо этого, который уменьшает i, в то время как он перечисляет через массив

private void orderNumberSetter(IEnumerable<Order> orders)
{
    int i = orders.Count();
    foreach (Order order in orders.ToArray())
    {
        order.orderNumber = --i;
    }            
}
2 голосов
/ 14 января 2012

Я согласен с BrokenGlass, вы работаете в бесконечном цикле.

Вы можете достичь того же, используя foreach:

private void orderNumberSetter(IEnumerable<Order> orders)
{
    var count = orders.Count();

    orders.ToList().ForEach(o =>
    {
         o.orderNumber = count--;
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...