Qualquer mecanismo de diff / merge de texto decente para .NET? [fechadas]

108

Requisitos:

  • grátis, de preferência de código aberto
  • implementado em um dos idiomas gerenciados .NET

O Google encontrou estes:

EDITAR:

Nenhum aplicativo, por favor, apenas bibliotecas.

aku
fonte
5
Este tópico não é trafegado há algum tempo, mas com qual projeto diff de código aberto você acabou indo? Estou procurando o mesmo e além das bibliotecas listadas não achei muito (decepcionado que tão pouco mudou em 2 anos ...).
março de 75
1
marr75: aqui vai [crédito para Cheeso / Brian (veja as respostas abaixo)]: "O código Google Diff / Patch / Merge foi portado para C #. O componente COM ainda funciona, mas se você estiver vindo do .NET, você vou querer usar a porta .NET diretamente. "
Dave
1
Concordo que essa resposta foi muito útil, é solicitar um mecanismo ou algoritmo para um problema de programação muito específico e o indiquei para reabrir.
Mladen Mihajlovic

Respostas:

88

Você pode pegar o componente COM que usa o Diff / Patch / Match do Google . Funciona a partir do .NET.

Atualização, 17 de outubro de 2010 : O código Google Diff / Patch / Merge foi portado para C #. O componente COM ainda funciona, mas se você estiver vindo do .NET, deverá usar a porta .NET diretamente.

Cheeso
fonte
14
Parece que isso foi transferido para C # (implementação C # totalmente gerenciada). A versão C # está disponível na seção de download da página do Google. Você pode editar a parte "COM" da sua resposta. Boa descoberta, pois essa implementação (pelo menos as versões python / js) são usadas em alguns projetos amplamente usados, como o Google Docs.
Brian Low,
Brian, obrigado. Eu atualizei a resposta.
Cheeso
6
Resposta muito útil em 2015. Por favor, não exclua, o site seria mais útil se esse tipo de coisa fosse permitido (leia-se: outro site vai permitir isso, e mais, e se levante e transforme o SO em troca de especialistas se perguntas úteis como esta continuam sendo fechados por motivos baseados na hipótese falha no SO faq).
FastAl
1
Eu recomendo DiffPlex . É netstandard1.0e muito leve. Você pode incorporá-lo facilmente em seu aplicativo WPF usando o RichTextBoxseguinte: github.com/halllo/WpfDiff
halllo
1
Uma porta mais centrada em C # (nomenclatura, caixa, etc.) está em: github.com/pocketberserker/Diff.Match.Patch com suporte a nuget:Install-Package Diff.Match.Patch
Kirk Woll
21

Acho que o "Generic - Reutilizável Diff Algorithm em C #" no Codeproject é o melhor que você pode encontrar como um .NET-Engine para diff / patch / merge. Fiz um projeto por conta própria com ele e ele atende às minhas necessidades na maioria dos cenários. Existem um ou dois cenários de pior caso, quando o algoritmo tornou o arquivo de patch maior do que deveria ser. Mas na maioria dos casos funciona bem para mim (arquivos de texto com tamanho> 30 MB).

No momento, estou testando outro projeto Codeproject que você pode encontrar aqui: http://www.codeproject.com/KB/applications/patch.aspx Ele está usando algumas DLLs da Microsoft para correção, por isso parece interessante. Mas essas DLLs não são gerenciadas e este projeto é apenas uma espécie de invólucro para ele. Mas talvez isso possa te ajudar

Edit: Acabei de encontrar outro projeto, DiffPlex : http://diffplex.codeplex.com/ É uma combinação de uma Biblioteca de Diffing .NET com um visualizador de Silverlight e HTML diff . Conforme declarado , DiffPlex é a biblioteca que o CodePlex utiliza para gerar as diferenças de arquivos.

Anheledir
fonte
Obrigado pela informação! mas espero encontrar uma solução mais sofisticada. Eu simplesmente não posso acreditar que ninguém criou algum lib puro
aku
1
Quando você encontrar uma biblioteca melhor, diga-nos (ou pelo menos eu g ) - Eu me procurei por um bom tempo e não encontrei nada além da já mencionada.
Anheledir
1
Diffplex mudou para github.com/mmanela/diffplex
codingdave
5

Nenhuma das respostas até agora (exceto possivelmente a referência GitSharp) lidam com mesclagem de 3 vias, então caso isso ajude alguém, recentemente portei a implementação de javascript diff3 de Tony Garnock-Jones (do projeto síncrotron , baseado em Hunt e McIlroy 1976) para C #.

É uma porta simplista de arquivo único de métodos diff e three-way merge, mas é o algoritmo padrão e até agora funciona muito bem para mim: https://gist.github.com/2633407

Tao
fonte
Não consigo resolver o link gist.github - gostaria de saber se o método de mesclagem de três vias poderia ser integrado em uma ferramenta como esta e se ele retorna resultados diferentes ou é de fato igual ao algoritmo Myers Diff que já está implementado?
user8276908