При создании частых маленьких фиксаций то запустите путем рассмотрения комментариев фиксации с git log --merge
. Тогда git diff
покажет Вам конфликты.
Для конфликтов, которые включают больше, чем несколько строк, легче видеть то, что продолжается во внешнем инструменте GUI. Мне нравится opendiff - Мерзавец также поддерживает vimdiff, gvimdiff, kdiff3, tkdiff, комбинация, xxdiff, появитесь из поля, и можно установить других: git config merge.tool "your.tool"
установит Ваш выбранный инструмент и затем git mergetool
после того, как неудавшееся слияние покажет Вам diffs в контексте.
Каждый раз, когда Вы редактируете файл для разрешения, конфликт, git add filename
обновит индекс, и разность больше не будет показывать его. Когда все конфликты обрабатываются, и их файлы были git add
- редактор, git commit
завершит Ваше слияние.
Как насчет:
public static Predicate<T> Or<T>(params Predicate<T>[] predicates)
{
return delegate (T item)
{
foreach (Predicate<T> predicate in predicates)
{
if (predicate(item))
{
return true;
}
}
return false;
};
}
И для полноты:
public static Predicate<T> And<T>(params Predicate<T>[] predicates)
{
return delegate (T item)
{
foreach (Predicate<T> predicate in predicates)
{
if (!predicate(item))
{
return false;
}
}
return true;
};
}
Затем вызовите его с помощью:
List<string> filteredNames = names.FindAll(Helpers.Or(StartsWithE, StartsWithI));
Другой альтернативой может быть использование многоадресных делегатов, а затем их разделение с помощью GetInvocationList ()
, затем сделайте то же самое. Тогда вы могли бы сделать:
List<string> filteredNames = names.FindAll(Helpers.Or(StartsWithE+StartsWithI));
Я не большой поклонник последнего подхода - это немного похоже на злоупотребление многоадресной рассылкой.
Вы можете создать третий предикат, который внутренне объединяет результаты вместе. Я думаю, вы могли бы сделать это на лету, используя лямбда-выражение. Что-то вроде этого (это не лямбда-выражение, так как я не слишком хорошо разбираюсь в этом snytax):
static bool StartsWithEorI(string s)
{
return StartsWithE(s) || StartsWithI(s);
}
В .NET 2.0 есть анонимные делегаты, которые вы можете использовать там:
List<string> filteredNames = names.FindAll(
delegate(string s) { return StartsWithE(s) OR StartsWithI(s); }
);
Фактически, вы также можете использовать его для замены своих функций:
List<string> filteredNames = names.FindAll(
delegate(string s) { return s.StartsWith("E") || s.StartsWith("I"); }
);
Вы можете обернуть метод предиката в класс и заставить конструктор принимать массив строк для проверки:
class StartsWithPredicate
{
private string[] _startStrings;
public StartsWithPredicate(params string[] startStrings)
{
_startStrings = startStrings;
}
public bool StartsWith(string s)
{
foreach (var test in _startStrings)
{
if (s.StartsWith(test))
{
return true;
}
}
return false;
}
}
Затем вы можете сделать такой вызов:
List<string> filtered = names.FindAll((new StartsWithPredicate("E", "I")).StartsWith);
Таким образом вы может тестировать любую комбинацию входных строк без необходимости расширять кодовую базу новыми вариантами метода StartsWith
.