Хорошо, вот мое занятие:
Пример использования
var src = new [] {1, 2, 3, 4, 5, 6};
var c3 = src.Chunks(3); // {{1, 2, 3}, {4, 5, 6}};
var c4 = src.Chunks(4); // {{1, 2, 3, 4}, {5, 6}};
var sum = c3.Select(c => c.Sum()); // {6, 15}
var count = c3.Count(); // 2
var take2 = c3.Select(c => c.Take(2)); // {{1, 2}, {4, 5}}
Пояснения
Код работает путем вложенности два итератора на основе yield
.
Внешний итератор должен отслеживать, сколько элементов было эффективно использовано внутренним (куском) итератором. Это делается закрытием remaining
с помощью innerMoveNext()
. Неиспользуемые элементы куска отбрасываются до того, как следующий кусок будет получен внешним итератором. Это необходимо, потому что в противном случае вы получите несогласованные результаты, когда внутренние перечислимые элементы не будут (полностью) потреблены (например, c3.Count()
вернет 6).
Примечание: Ответ был обновлен для устранения недостатков, отмеченных @ aolszowka.
blockquote>
Git использует эвристику, чтобы определить, было ли изменение переименованием или копированием файла, а также если это «переписывание» файла. Грубо говоря, если различие между старой и новой версиями больше, чем сама новая версия, это «переписать».
Это настроено на первоначальный вариант использования git для изменения исходных файлов, чаще всего делая локализованные изменения: поскольку он основан на линейном разграничении, такие вещи, как переименование исходного файла, могут вызвать его. Кроме того, поскольку он определяется «на лету», параметры diff, такие как «-b» и «-w», могут изменить оценку того, является ли изменение переписыванием (или копией или переименованием).
Процент - это «индекс несходства» git (в отличие от процентного «индекса подобия» для переименования или копирования). Вероятно, что-то вроде процента строк в файле, который изменился.
git diff --summary HEAD^..
). Таким образом, другие изменения являются «нормальными». изменения в файлах - недостаточно для запуска эвристики перезаписи. – araqnid 2 December 2012 в 14:05