c # лямбда, LINQ .... улучшить этот метод - PullRequest
5 голосов
/ 27 марта 2009

Я нахожусь в процессе изучения дополнительных сведений о выражениях LINQ и Lambda, но на данном этапе я просто не "получаю" выражения Lambda.

Да ... Я новичок в этих новых понятиях.

Я имею в виду, что каждый пример, который я вижу, иллюстрирует, как добавлять или вычитать параметры.

Как насчет чего-то более сложного?

Чтобы помочь мне лучше понять, я отправил небольшую задачу для всех, кто хочет участвовать. У меня есть следующий метод, который будет принимать любую строку и ставить пробелы между любыми символами верхнего регистра и их предшествующим соседом (как показано ниже).

1011 * т.е. * "SampleText" = "Образец текста"
"DoesNotMatterHowManyWords" = "Не важно, сколько слов"

Вот код;

public static string ProperSpace(string text)
{
    var sb = new StringBuilder();
    var lowered = text.ToLower();

    for (var i = 0; i < text.Length; i++)
    {
        var a = text.Substring(i, 1);
        var b = lowered.Substring(i, 1);
        if (a != b) sb.Append(" ");
        sb.Append(a);
    }

    return sb.ToString().Trim();
}

Я уверен, что описанный выше метод можно переписать для использования с LINQ или лямбда-выражением. Я надеюсь, что это упражнение поможет мне открыть глаза на эти новые концепции.

Также, если у вас есть хорошие ссылки на учебные пособия по LINQ или Lambda, пожалуйста, предоставьте.


EDIT

Спасибо всем, кто внес свой вклад. Хотя текущий метод выполняет свою работу, я рад видеть, что его можно изменить, чтобы использовать лямбда-выражение. Я также признаю, что это, возможно, не лучший пример для LINQ.

Вот недавно обновленный метод, использующий лямбда-выражение (проверено на работу);

public static string ProperSpace(string text)
{
    return text.Aggregate(new StringBuilder(), (sb, c) =>
    {
        if (Char.IsUpper(c)) sb.Append(" ");
        sb.Append(c);
        return sb;
    }).ToString().Trim();
}

Я также ценю множество ссылок на другие (похожие) темы.

В частности эта тема , что так верно.

Ответы [ 11 ]

0 голосов
/ 27 марта 2009

Мне любопытно, почему простой замены регулярного выражения будет недостаточно. Я написал один для кого-то другого, который делает именно это:

"[AI](?![A-Z]{2,})[a-z]*|[A-Z][a-z]+|[A-Z]{2,}(?=[A-Z]|$)"

Я уже разместил это на другой доске объявлений здесь: http://bytes.com/topic/c-sharp/answers/864056-string-manupulation-net-c. Есть одна ошибка, которая требует обрезки пост-регулярных выражений, которую я еще не имел возможности устранить, но, возможно, кто-то еще может опубликовать исправление .

Использование шаблона замены: "$ 0 [пробел]", где вы заменяете [пробел] фактическим пробелом, значительно сократит код.

Он обрабатывает некоторые особые случаи, которые могут выходить за рамки того, что вы пытаетесь сделать, но нить на доске объявлений предоставит вам информацию о них.

Редактировать: P.S. Отличным способом начать изучение некоторых приложений LINQ является проверка тегов GOLF и CODE-GOLF и поиск сообщений на C #. Существует множество различных и более сложных способов использования LINQ-to-Objects, которые должны помочь вам распознать некоторые из наиболее полезных (?) И забавных приложений этой технологии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...