LINQ способ превращения "TheQuickBrownFox" в "Быструю коричневую лису" - PullRequest
2 голосов
/ 18 октября 2010

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

Например, «TheQuickBrownFox» станет «Быстрая коричневая лиса».

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

Не могли бы вы решить, как решить эту проблему элегантно с помощью LINQ?

Спасибо за вашу помощь.

Ответы [ 6 ]

7 голосов
/ 18 октября 2010

Вы можете разделить слова с помощью регулярного выражения (и небольшого LINQ):

public string SplitAsWords(string original)
{
    var matches = Regex.Matches(original, "[A-Z][a-z]*").Cast<Match>();
    var str = string.Join(" ", matches.Select(match => match.Value));
    str = str[0] + str.Substring(1).ToLower();
    return str;
}

Пример использования:

[Test]
public void Example()
{
    string str = SplitAsWords("TheQuickBrownFox");
    Assert.That(str, Is.EqualTo("The quick brown fox"));
}

Альтернативной реализацией с использованием регулярного выражения может бытьбез LINQ):

public string SplitAsWords(string original)
{
    var str = Regex.Replace(original, "[a-z][A-Z]", 
        new MatchEvaluator(match => match.Value.ToLower().Insert(1, " ")));

    return str;
}
1 голос
/ 18 октября 2010
string s = "TheQuickBrownFox";
string transformed = s.Aggregate(new StringBuilder(), (sb, c) =>
    Char.IsUpper(c) && sb.Length > 0 ? sb.AppendFormat(" {0}", Char.ToLower(c)) : sb.Append(c)).ToString();
1 голос
/ 18 октября 2010

Это не идеально для таких ситуаций, как «PaulTookTheSAT» или «McDonald'sIsNasty».

string input = "TheQuickBrownFox";
string output  = input.Select((c, i) => i == 0 ? c.ToString() : char.IsUpper(c) ? " " + c.ToString().ToLower() : c.ToString()).Aggregate((a,b) => a + b);

Редактировать : Использование (в основном) синтаксиса выражения запроса

string output = (from item in input.Select((c,i) => new { c, i })
                let x = item.i == 0 
                            ? item.c.ToString() 
                            : (char.IsUpper(item.c) ? " " + item.c.ToString().ToLower() : item.c.ToString())
                select x).Aggregate((a, b) => a + b);
0 голосов
/ 12 января 2012

Линк был построен с учетом функционального стиля. Использование этого императивного способа не привело бы к элегантному коду. Поэтому не преобразуйте после запроса, а в запросе - поместите логику в раздел проекции (выберите). (Очень похоже на ответ Энтони)

var str = (from i in Regex.Split("TheQuickBrownFox", "")
                 select Regex.IsMatch(i, "[A-Z]") ? " " + i : i)
                 .Aggregate((str1, str2) => str1 + str2);

        Console.WriteLine(str);
0 голосов
/ 18 октября 2010

Как насчет этого?

        string phrase = "TheQuickBrownFox";

        var invalidChars = from ch in phrase
                           where char.IsUpper(ch)
                           select ch;

        foreach (char ch in invalidChars)
        {
            int index = phrase.IndexOf(ch);

            phrase = phrase.Remove(index, 1);
            phrase = phrase.Insert(index, " " + ch);
        }

        Console.WriteLine(phrase);
        Console.ReadLine();
0 голосов
/ 18 октября 2010

С System.Text.RegularExpressions.Regexp

System.Text.RegularExpressions.Regex.Split("TheQuickBrownFox","([A-Z][^A-Z]+)").Where(s=>s!="");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...