Если Вы не хотите дубликаты, используйте Набор вместо List
. Для преобразования List
в Set
, можно использовать следующий код:
// list is some List of Strings
Set s = new HashSet(list);
, Если действительно необходимый можно использовать ту же конструкцию для преобразования Set
назад в List
.
Я проделал это в клиентских проектах несколько раз и использовал Reflector, как и другие комментаторы. Такое случается чаще, чем следует. Например, когда кто-то внезапно покидает команду разработчиков. В одном проекте мою команду подрядчиков вызвали после того, как покинула ВЕСЬ команда разработчиков, и мы должны были следовать этой процедуре на каждом отдельном фрагменте кода, работающем в производственной среде, чтобы быть уверенными в том, что на самом деле было у нас в руках.
Способ Я занимаюсь этим, беря КАЖДУЮ версию скомпилированного кода, которая доступна, в отдельную область файловой системы. Это включает версию, которая находится в системе контроля версий или не на рабочей станции разработчика. Это важно, потому что Reflector видит IL, а не фактический исходный источник, и вы хотите сравнить яблоки с яблоками.
Я использую FileDisassembler for Reflector , чтобы декомпилировать каждый из двоичных файлов в отдельную папку. В итоге я получаю структуру, которая выглядит примерно так:
ProjectXyzReconciliation |-production |-staging |-test |-qa |-devworkstation |-sourcecontrol |-reconciled (this is what will eventually go back in source control)
Затем я использую WinMerge (но также хорошо использовал другие инструменты слияния / сравнения), чтобы сравнить каталоги и объединить их в «согласованную» папку. Я обычно заполняю это тем, что работает в производстве, для начала и сравниваю с ним все остальные версии.
Первый этап - это просто посмотреть, что отличает, и декомпиляция в файлы позволяет вам использовать такие инструменты, как WinMerge, чтобы получать отчеты о том, что на самом деле разные для принятия решений.
Иногда этот процесс приводит к одному или двум изменениям, которые легко отследить до ошибок в базе данных отслеживания ошибок или электронных писем и т. д. и могут быть приняты решения относительно того, следует ли его использовать или оставить для дальнейшей работы.
Когда каждое различие объяснено и либо объединено, либо отклонено для последующей переделки или удаления, вновь согласованный код используется в качестве новой основы для будущего развития и рефакторинга. При этом теряются все комментарии, которые были в коде, но когда вся эта процедура была необходима, потеря комментариев не была большой потерей, если честно.
В первый раз это может показаться пугающим, но члены моей команды, которые хорошо в этом разбирались, обнаружили, что в более поздних проектах они часто могут казаться героями, поскольку они способны, казалось бы, совершать невозможное, когда возникает неприятная ситуация, и поэтому стоит положить это в свой набор инструментов.
Когда каждое различие объяснено и либо объединено, либо отклонено для дальнейшей переработки или удаления, вновь согласованный код используется в качестве новой основы для будущей разработки и рефакторинга. При этом теряются все комментарии, которые были в коде, но когда вся эта процедура была необходима, потеря комментариев не была большой потерей, если честно.
В первый раз это может показаться пугающим, но члены моих команд, которые хорошо в этом разбирались, обнаружили, что в более поздних проектах они часто могут казаться героями из-за того, что они способны, казалось бы, совершать невозможное, когда возникает неприятная ситуация, и поэтому стоит положить это в свой набор инструментов.
Когда каждое различие объяснено и либо объединено, либо отклонено для дальнейшей переработки или удаления, вновь согласованный код используется в качестве новой основы для будущей разработки и рефакторинга. При этом теряются все комментарии, которые были в коде, но когда вся эта процедура была необходима, потеря комментариев не была большой потерей, если честно.
В первый раз это может показаться пугающим, но члены моих команд, которые хорошо в этом разбирались, обнаружили, что в более поздних проектах они часто могут казаться героями из-за того, что они способны, казалось бы, совершать невозможное, когда возникает неприятная ситуация, и поэтому стоит положить это в свой набор инструментов.
Если бы я был в вашей ситуации, я бы скомпилировал каждый из 4 отдельных исходных проектов по одному ... Затем запустите надстройку diff для .NET Reflector , чтобы проверить, есть ли у вас совпадение с производственной сборкой. Если нет, скомпилируйте следующий исходный проект и повторите попытку.
Если каталоги вашего проекта содержат артефакты сборки, такие как библиотеки DLL и EXE, вы можете проверить номера версий и сравнить их с производственными. Даже если вы не найдете точного совпадения, вы увидите, что может быть наиболее близким.
.NET Reflector - удобный инструмент для просмотра того, какой код используется на данном сервере.