Объедините несколько предикатов

При создании частых маленьких фиксаций то запустите путем рассмотрения комментариев фиксации с 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 завершит Ваше слияние.

33
задан sth 13 August 2009 в 21:18
поделиться

4 ответа

Как насчет:

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));

Я не большой поклонник последнего подхода - это немного похоже на злоупотребление многоадресной рассылкой.

60
ответ дан 27 November 2019 в 17:37
поделиться

Вы можете создать третий предикат, который внутренне объединяет результаты вместе. Я думаю, вы могли бы сделать это на лету, используя лямбда-выражение. Что-то вроде этого (это не лямбда-выражение, так как я не слишком хорошо разбираюсь в этом snytax):

static bool StartsWithEorI(string s)
{
    return StartsWithE(s) || StartsWithI(s);
}
0
ответ дан 27 November 2019 в 17:37
поделиться

В .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"); }
);
1
ответ дан 27 November 2019 в 17:37
поделиться

Вы можете обернуть метод предиката в класс и заставить конструктор принимать массив строк для проверки:

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 .

0
ответ дан 27 November 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: