Выложил в сниппеты реализацию Diff-Patch-Match в виде методов-расширений к массивам IEquatable элементов:
public Diff[T](
[NotNull] this sequenceA : array[T],
[NotNull] sequenceB : array[T]
): array[DiffItem[T]]
where T : IEquatable[T]
— возвращает последовательность "разниц": наборов операций удаления и вставки, необходимых для получения sequenceB из sequenceA.
public Patch[T](
[NotNull] this sequenceA : array[T],
[NotNull] diffData : array[DiffItem[T]]
) : array[T]
— обратная операция: по последовательности "разниц" и переданной sequenceA, строит sequenceB.
public Match[T](
[NotNull] this sequenceA : array[T],
[NotNull] sequenceB : array[T]
) : double
— определяет коэффициент соответствия между sequenceA и sequenceB (от 0.0 — полностью различны, до 1.0 — полностью идентичны). Оригинальный Match из этой триады операций с последовательностями делает "несколько" больше, но для моих задач было нужно именно это.
Простенькая демка:
и основные тесты включены, будут вопросы — welcome.
P.S: Массивы и императивщина чуть более, чем везде, но я в домике не программер, мне можно :-P
Здравствуйте, kochetkov.vladimir, Вы писали:
KV>Выложил в сниппеты реализацию Diff-Patch-Match в виде методов-расширений к массивам IEquatable элементов:
KV>
KV>public Diff[T](
KV> [NotNull] this sequenceA : array[T],
KV> [NotNull] sequenceB : array[T]
KV>): array[DiffItem[T]]
KV>where T : IEquatable[T]
KV>
KV>- возвращает последовательность "разниц": наборов операций удаления и вставки, необходимых для получения sequenceB из sequenceA.
KV>и основные тесты включены, будут вопросы — welcome.
Здравствуйте, kochetkov.vladimir, Вы писали:
KV>я не знаю, как в коде метода создавать экземпляр выделенного
*чтоб не решили, что я в танке, а не в домике* я в курсе, что экземпляр интерфейса создать нельзя, но я хз, как правильно в nemerle описать контракт такого метода и как его реализовать.
KV>>я не знаю, как в коде метода создавать экземпляр выделенного
H>System.Collections.Generic.List[T] ?
Тип возвращаемого значения должен быть в точности таким же, как у sequenceA (которая в рассматриваемом сценарии может быть как List[T], так и массивом).
KV>>>я не знаю, как в коде метода создавать экземпляр выделенного
H>>System.Collections.Generic.List[T] ?
KV>Тип возвращаемого значения должен быть в точности таким же, как у sequenceA (которая в рассматриваемом сценарии может быть как List[T], так и массивом).
Вот такая конструкция мне видится допустимой:
public Patch[TCollection, TItem](
[NotNull] this sequenceA : TCollection,
[NotNull] diffData : array[DiffItem[T]]
) : TCollection
wherw TCollection: IList[TItem], new()
Здравствуйте, hardcase, Вы писали:
KV>>Тип возвращаемого значения должен быть в точности таким же, как у sequenceA (которая в рассматриваемом сценарии может быть как List[T], так и массивом).
H>Вот такая конструкция мне видится допустимой: H>
Да, это оно и есть, пасиб. Правда внезапно обнаружились еще две фигни: во-первых, у массивов нет конструкторов без параметров, а во-вторых, реализация некоторых методов IList в массивах, типа Add() выбрасывает NotImplemented (ну, понятно почему, в приницпе). Следовательно и способы формирования sequenceB для массивов и всего остального будут отличаться: для массивов это будет просто Array.Copy из оригинальной последовательности и элементов diff, а для прочих IList'ов — последовательное добавление элементов
Здравствуйте, kochetkov.vladimir, Вы писали:
H>>Поправил сборку солюшена в релизной конфигурации (отключил дебаг символы). KV>Кстати, а зачем они вообще по умолчанию включены в шаблоне проекта для релиза?
Так сделано для шарповых проектов, например. А чем они мешают-то? Неужели места на диске много занимают?
Help will always be given at Hogwarts to those who ask for it.
KV>>>я не знаю, как в коде метода создавать экземпляр выделенного H>>System.Collections.Generic.List[T] ?
KV>Тип возвращаемого значения должен быть в точности таким же, как у sequenceA (которая в рассматриваемом сценарии может быть как List[T], так и массивом).
) данной гарантии не обеспечит: во время компидляции рантаймовый тип sequenceA может отличаться от того, что вычислит компилятор или пользователь при вызове укажет явно, не смотря на ограничение new().
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, kochetkov.vladimir, Вы писали:
H>>>Поправил сборку солюшена в релизной конфигурации (отключил дебаг символы). KV>>Кстати, а зачем они вообще по умолчанию включены в шаблоне проекта для релиза?
_FR>Так сделано для шарповых проектов, например. А чем они мешают-то? Неужели места на диске много занимают?
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, kochetkov.vladimir, Вы писали:
H>>>Поправил сборку солюшена в релизной конфигурации (отключил дебаг символы). KV>>Кстати, а зачем они вообще по умолчанию включены в шаблоне проекта для релиза?
_FR>Так сделано для шарповых проектов, например. А чем они мешают-то? Неужели места на диске много занимают?
Тем что в C# проектах за отладочную информацию отвечает параметр <DebugType>, он имеет 3 значения: Full, None, PdbOnly. А в немерловых — <DebugSymbols>, он имеет только два значения: true, false. Таким образом, если включить <DebugSymbols> в релизе, то никаких оптимизаций рантайма не получим. Блудов как-то хотел сделать как в C#, при условии что "ему объяснят зачем нужен pdb в релизе".
) данной гарантии не обеспечит: во время компидляции рантаймовый тип sequenceA может отличаться от того, что вычислит компилятор или пользователь при вызове укажет явно, не смотря на ограничение new().
Вот поэтому там массивы В них можно преобразовать любую последовательность, а для большинства членов System.IO они являются "родным типом", что в моих задачах немаловажно, т.к. там имеет место интенсивная работа с огромными файлами.