LINQ将“TheQuickBrownFox”转换为“快速棕狐”的方式

时间:2010-10-18 13:34:50

标签: c# linq string

我正在尝试转换由大写字母开头的单词组成的字符串。我想用空格分隔每个单词,只保留第一个大写字母。所有其他字母应为小写。

例如,“TheQuickBrownFox”将成为“快速棕色狐狸”。

显然,我可以使用一个简单的foreach并通过检查每个字符来构建一个字符串,但我正在尝试使用LINQ。

您是否知道如何使用LINQ优雅地解决这个问题?

感谢您的帮助。

6 个答案:

答案 0 :(得分:7)

您可以使用正则表达式(以及小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 :(得分:1)

这对于“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);

答案 2 :(得分:1)

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

答案 3 :(得分:0)

使用System.Text.RegularExpressions.Regexp

System.Text.RegularExpressions.Regex.Split("TheQuickBrownFox","([A-Z][^A-Z]+)").Where(s=>s!="");

答案 4 :(得分:0)

这个怎么样?

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

答案 5 :(得分:0)

Linq的构建充满了功能性风格。使用它的命令式方法不会以优雅的代码结束。所以不要在查询之后但在查询中进行转换 - 将逻辑放在投影部分(选择)。 (很像安东尼的回答)

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

        Console.WriteLine(str);