我正在努力使用C#中的Where()方法将字符串转换为驼色大小写,代码什么都不做



正如标题中所提到的,我正试图将单词之间有空格的给定字符串转换为驼色大小写格式,例如:"骆驼案";变成";camelCase";。

我的方法是尝试将字符串转换为一个字符数组,然后检查前一个字符是否是空格,但我一直在使用where((方法来检查每个字符:

str=新字符串(str.Where(x=>Array.IndexOf(str.ToCharArray((,x(-1!=''(。ToArray(((

这只是返回原始字符串,而不执行任何操作。

任何帮助都将不胜感激,也许你也可以建议一个更好的方法,毕竟,我们都在一起,对吧?

这是我的linq-select 版本

public static string ToCamelCase(string value)
{
int n = 0;
return string.Join("",
value.ToLower()
.Split(' ')
.Select(t => string.IsNullOrEmpty(t) ? ""
: n++ == 0
? t
: $"{t.Substring(0, 1).ToUpper()}{t.Substring(1)}"
);
}

除非你需要在没有正则表达式的情况下完成,否则我只会使用它。

有一种方法:

Regex
.Replace(str, @"s+([^s])", ma => ma.Groups[1].Value.ToUpperInvariant())
.TrimEnd()

这将用一个或多个空白字符的大写版本替换后面跟着非空白字符的空白字符序列。

从本质上讲,它将删除所有空白(除了最后的空白,因此是.TrimEnd()方法(,并尝试将每个空白序列后面的第一个字符转换为大写。

示例代码:

string input = "locate the next person of age 50 or above";
string output = Regex
.Replace(input, @"s+([^s])", ma => ma.Groups[1].Value.ToUpperInvariant())
.Trim();
Console.WriteLine(output);

输出:

locateTheNextPersonOfAge50OrAbove

我会使用一个简单的循环。

public static string ToCamelCase(this string value) 
{
string result = string.Empty;
bool nextUpper = false;
for (int i = 0; i < value.Length; i++)
{
if (value[i] == ' ')
nextUpper = true;
else
{
if (nextUpper)
result += value[i].ToString().ToUpper();
else
result += value[i].ToString().ToLower();
nextUpper = false;
}
}
return result;
}

这是因为字符串中有两个cs,所以Array.IndexOf((将始终返回第一个c的位置。也许一些LINQ魔术师可以用合适的LINQ来解决这个问题,但如果你不介意使用其他方法,StringBuilder和通过str的foreach循环可以实现任务。

类似于:

string str = "camel case";
StringBuilder sb = new StringBuilder();
bool pickedSpace = false;
foreach (char c in str)
{
if (c == ' ')
pickedSpace = true;
else if (pickedSpace) {
sb.Append(Char.ToUpper(c));
pickedSpace = false;
} else {
sb.Append(c);
}
}
Console.WriteLine(sb.ToString());

您还可以检查StringBuilder中的最后一个元素是否为空格,然后删除它和ToUpper()的下一个要联接的字符,而不是使用布尔值,以减少开销。

最新更新