有以下代码,它具有一个功能,该功能可以找到单词中间的字母(1个或2个字符)并将其大写,然后输出。
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(test("Rofl"));
Console.WriteLine(test("Camel"));
Console.WriteLine(test("R"));
}
public static String test(string value) {
return value.Length % 2 == 0
? value.Substring(value.Length / 2 - 1, 2).ToUpper()
: value.Substring(value.Length / 2, 1).ToUpper();
}
}
请告诉我,如何使该词完全衍生,但中间的字母完全由大写字母代替?
必须这样:
ROFl
CaMel
R
答案 0 :(得分:3)
像这样? 不是最干净的方法。
public static string test(string value)
{
if(string.IsNullOrEmpty(value)) return value;
var array = value.ToCharArray();
if (value.Length % 2 == 0)
{
array[value.Length / 2 - 1] = Char.ToUpper(array[value.Length / 2 - 1]);
array[value.Length / 2] = Char.ToUpper(array[value.Length / 2]);
}
else
{
array[value.Length / 2] = Char.ToUpper(value[value.Length / 2]);
}
return new string(array);
}
答案 1 :(得分:1)
您可以使用对元素索引对有效的LINQ select
AdID,
DateRun,
Metric,
avg(Metric) over(
partition by Metric, date_trunc(DateRun, month)
) month_avg_metric,
Metric - avg(Metric) over(
partition by Metric, date_trunc(DateRun, month)
) diff_with_month_avg_metric
from mytable
重载来进行转换。
Select
这是相当不错的表现,因为public string MiddleLettersToUpper(string s)
{
IEnumerable<char> transformed;
if (s.Length % 2 == 0)
{
transformed = s.Select((c, i) =>
i == s.Length / 2 || i == s.Length / 2 - 1 ? char.ToUpper(c) : c);
}
else
{
transformed = s.Select((c, i) =>
i == s.Length / 2 ? char.ToUpper(c) : c);
}
return string.Concat(transformed);
}
在下面使用了string.Concat
,因此您只需要对字符串进行一次遍历,并为结果分配一个字符串。
免责声明:使用StringBuilder
时,此代码不关心区域性,因此不适合生产(也没有参数验证,但这很明显)。
答案 2 :(得分:0)
您可以使用正则表达式来做到这一点:
public static string test(string value)
{
value = value ?? string.Empty;
int half = value.Length % 2 == 0 ? (value.Length / 2) - 1: (value.Length / 2);
Regex r = new Regex("(?<=^.{"+ half + "})[a-zA-Z]{1,2}(?=.{"+ half + "}$)");
var match = r.Match(value);
if (match != null)
{
var result = r.Replace(value, match.ToString().ToUpper());
return result;
}
return value;
}
首先,我们发现字母的一半计数(大写字母的字母数和末尾不增加字母的字母数)
正则表达式说明:
找到行的开头(^)+任何字符(。)的一半计数({half}),但不要接受它们(正数在Lookahead之前?<=)
然后在abc([a-zA-Z])中找到一个或两个字符({1,2})-这就是匹配项
,最后找到任何半角({half})+行尾($)的字符(。),但不要再使用它们(正向Lookahead?=后面)。
您可以在这里测试此正则表达式:regex101