Параметр лямбды не в объеме — при создании двоичного лямбда-выражения

Для ясности мне нравится делать начальный цикл, где я собираю объекты для удаления. Тогда я удаляю их. Вот является демонстрационный Objective C использования 2,0 синтаксисами:

NSMutableArray *discardedItems = [NSMutableArray array];

for (SomeObjectClass *item in originalArrayOfItems) {
    if ([item shouldBeDiscarded])
        [discardedItems addObject:item];
}

[originalArrayOfItems removeObjectsInArray:discardedItems];

Тогда нет никакого вопроса о том, обновляются ли индексы правильно, или другие небольшие бухгалтерские детали.

Отредактированный для добавления:

было отмечено в других ответах, что обратная формулировка должна быть быстрее. т.е. Если Вы выполняете итерации через массив и составляете новый массив объектов оставаться вместо объектов отбросить. Это может быть верно (хотя что относительно памяти и стоимости обработки выделения нового массива и отбрасывания старого?), но даже если бы это быстрее, это не может быть столь же большое соглашение, как это было бы для наивной реализации, потому что NSArrays не ведут себя как "нормальные" массивы. Они говорят разговор, но они обходят различный обход. Посмотрите хороший анализ здесь:

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

Для меня сообщение взятия домой должно использовать любую формулировку, является самым ясным Вам. Оптимизируйте только если необходимый. Я лично нахожу вышеупомянутую формулировку самой ясной, который является, почему я использую ее. Но если обратная формулировка более ясна Вам, пойдите для нее.

7
задан TonyAbell 15 October 2009 в 19:12
поделиться

1 ответ

Вам необходимо повторно использовать тот же объект параметра. Итак, где у вас:

 MemberExpression left = Expression.Property
     (Expression.Parameter(typeof(OtherType), "para"), property);

это должно быть:

  MemberExpression left = Expression.Property(para, property);

Я знаю, что им было бы разумно сопоставить их по имени, но это просто не так, как это работает: (

Если это хоть какое-то утешение, Я очень редко получаю построенные вручную деревья экспрессии с первого раза. Я должен ругать их какое-то время. С другой стороны, я считаю, что в достаточно холодные дни Марк Гравелл может осторожно выдохнуть, и его дыхание будет выходить в виде идеального, холодного выражения древовидного кода ...

11
ответ дан 6 December 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: