Статическая компиляция в мире.NET

SequenceEquals тесты для идентичности элементов внутри последовательностей. Элементы в перечислениях имеют тип long[], поэтому мы фактически сравниваем два разных массива (содержащих одни и те же элементы) друг против друга, что наглядно сделано путем сравнения их ссылок вместо их фактического значения.

Итак, что мы на самом деле проверяем здесь, это expected[0] == actual[0] вместо expected[0].SequqnceEquals(actual[0])

Это obiosuly возвращает false, поскольку оба массива используют разные ссылки.

Если мы сглаживаем иерархию с помощью SelectMany, получаем то, что хотим:

if (!actual.SelectMany(x => x).SequenceEqual(expected.SelectMany(x => x))) throw new Exception();

EDIT:

На основе этот подход нашел другое элегантное способ проверить, содержатся ли все элементы из expected в actual:

if (!expected.All(x => actual.Any(y => y.SequenceEqual(x)))) throw new Exception();

Это будет поиск, если на вечном суб-списке внутри expected есть список внутри actual который последовательно идентичен текущему. Это кажется гораздо умнее, так как нам не нужны никакие пользовательские EqualityComparer и не странные хэш-код-реализация.

17
задан AngryHacker 23 March 2009 в 00:55
поделиться

2 ответа

Можно попытаться использовать Саламандра Remotesoft.

Это делает точно, что Вы хотите.

11
ответ дан 30 November 2019 в 13:54
поделиться

Mono значительно улучшил поддержку компиляции Ahead of Time (AOT) до такой степени, что, если вы хотите / можете настроить таргетинг на Mono, а не на среда выполнения .Net должна иметь возможность статически компилировать практически любое приложение CIL.

Является ли это хорошей идеей в целом, полностью зависит от приложения и ваших ограничений.

Например, Novell теперь поставляет MonoTouch, реализацию интерфейса командной строки, которая полностью скомпилирована и связана с AOT, что позволяет приложениям .Net (а не только играм) запускаться на iPhone в среде CocoaTouch.

Те же самые методы AOT можно использовать для компиляции приложения Winforms, для которого не требуется среда выполнения .Net или Mono в качестве предварительных условий. Существует множество компромиссов производительности (как положительных, так и отрицательных), связанных с AOT, поэтому я бы не стал двигаться вперед без должной осмотрительности.


Редактировать:

В ответ на вопрос Джона Сондерса о том, «почему бы просто не установить его для них?». На самом деле это вызывает одну причину, по которой вам может понадобиться компиляция AOT ... Загрузочные файлы.

Чтобы что-то установить, вы должны запустить исполняемый файл.Вы можете либо распространять MSI (который неявно запускает msiexec.exe), либо вы можете распространять exe. MSI, хотя и функциональна, доставляет неудобства разработчикам. Таким образом, вы можете создать свой загрузчик, используя .NET (скомпилированный AOT исключает зависимость времени выполнения), который устанавливает все необходимые предварительные условия (например, .NET) перед установкой вашего приложения.

Кроме того, некоторым компаниям может потребоваться поставлять загружаемые исполняемые файлы, которые не требуют от пользователей установки чего-либо (автоматически или иным образом).

Еще одно: для установки .NET требуются права администратора. AOT может позволить вам обойти это требование для вашего приложения.

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

8
ответ дан 30 November 2019 в 13:54
поделиться
Другие вопросы по тегам:

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