我正在尝试转换由大写字母开头的单词组成的字符串。我想用空格分隔每个单词,只保留第一个大写字母。所有其他字母应为小写。
例如,“TheQuickBrownFox”将成为“快速棕色狐狸”。
显然,我可以使用一个简单的foreach
并通过检查每个字符来构建一个字符串,但我正在尝试使用LINQ。
您是否知道如何使用LINQ优雅地解决这个问题?
感谢您的帮助。
答案 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);