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.


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.


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.


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.