условный строковый агрегат .net - PullRequest
0 голосов
/ 08 августа 2011

У меня есть следующий код

var definitionMap = definitions.Aggregate("", (current, next) => 
    current +  "[\\W\\s]" + 
    next.Tag.Replace("(", "\\(").Replace(")", "\\)") + "[\\W\\s]" + "|");

Это работает довольно хорошо, за исключением того, что я получаю трейлинг | в конце концов, я мог бы просто удалить это вручную, но в любом случае есть ли способ, чтобы агрегатный метод не поместил его туда в первую очередь

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Вы можете добавить его условно в начало каждого термина, то есть

(current, next) => (current == "" ? "" : "|") + ...

Однако я бы также предложил вам взглянуть на StringBuilder и цикл foreach здесьвместо Aggregate.На самом деле, поскольку StringBuilder имеет свободный API, вы можете на самом деле использовать его внутри Aggregate - но я не рекомендую его.Тот факт, что вы можете использовать метод расширения LINQ, не означает, что он автоматически либо яснее , либо лучше .В данном случае это не ИМО.В частности, в данный момент вы генерируете лот ненужных промежуточных строк.

0 голосов
/ 08 августа 2011

Почему бы просто не пойти с String.Join и Select?

var definitionMap =
    String.Join("|",
        definitions.Select(
            next =>
                "[\\W\\s]"
                + next.Tag.Replace("(", "\\(").Replace(")", "\\)")
                + "[\\W\\s]"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...