모범 사례 - 문자열의 첫 번째 문자를 소문자로 변환
문자열의 첫 번째 문자를 소문자로 변환하는 방법을 원합니다.
내 접근 방식:
1.
public static string ReplaceFirstCharacterToLowerVariant(string name)
{
return String.Format("{0}{1}", name.First().ToString().ToLowerInvariant(), name.Substring(1));
}
2.
public static IEnumerable<char> FirstLetterToLowerCase(string value)
{
var firstChar = (byte)value.First();
return string.Format("{0}{1}", (char)(firstChar + 32), value.Substring(1));
}
당신의 접근법은 무엇입니까?
간단한 연결을 사용합니다.
Char.ToLowerInvariant(name[0]) + name.Substring(1)
첫 번째 솔루션은 다음과 같은 이유로 최적화되지 않았습니다.string.Format
속도가 느리고 절대 변경되지 않는 형식을 사용하는 경우 필요하지 않습니다.또한 문자를 소문자로 숨기기 위해 추가 문자열을 생성하지만, 이는 필요하지 않습니다.
"+ 32"를 사용하는 접근 방식은 ASCII 문자 값 오프셋에 대한 지식이 필요하기 때문에 추하거나 유지 관리할 수 없습니다.또한 유니코드 데이터 및 ASCII 기호 문자로 잘못된 출력을 생성합니다.
상황에 따라 약간의 방어적 프로그래밍이 바람직할 수 있습니다.
public static string FirstCharacterToLower(string str)
{
if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0))
return str;
return Char.ToLowerInvariant(str[0]) + str.Substring(1);
}
그if
문은 또한 새 문자열이 변경되지 않을 경우 새 문자열이 생성되는 것을 방지합니다.대신에 메소드를 null 입력에서 실패하게 하고 다음을 수행할 수 있습니다.ArgumentNullException
.
사람들이 언급했듯이, 사용은String.Format
이건 과잉 살상이기 때문입니다
혹시라도 이 답을 우연히 발견한 사람에게 도움이 될 경우에 대비해서요.
이것이 확장 방법으로 가장 좋을 것 같습니다, 그러면 당신의 String과 함께 호출할 수 있습니다.첫 번째 문자부터 아래()까지;
public static class StringExtensions
{
public static string FirstCharacterToLower(this string str)
{
if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0))
{
return str;
}
return Char.ToLowerInvariant(str[0]) + str.Substring(1);
}
}
c#을 남용하지 않고 내가 아는 가장 빠른 해결책:
public static string LowerCaseFirstLetter(string value)
{
if (value?.Length > 0)
{
var letters = value.ToCharArray();
letters[0] = char.ToLowerInvariant(letters[0]);
return new string(letters);
}
return value;
}
내꺼는
if (!string.IsNullOrEmpty (val) && val.Length > 0)
{
return val[0].ToString().ToLowerInvariant() + val.Remove (0,1);
}
수락된 답변이 마음에 들지만 확인 외에string.IsNullOrEmpty
또한 확인해 보겠습니다.Char.IsLower(name[1])
약어를 다루는 경우.예를 들어, "AIDS"가 "aIDS"가 되는 것을 원하지 않을 것입니다.
당신이 성능에 관심이 있다면 저는 함께 갈 것입니다.
public static string FirstCharToLower(this string str)
=> string.Create(str.Length, str, (output, input) =>
{
input.CopyTo(output);
output[0] = char.ToLowerInvariant(input[0]);
});
빠른 벤치마킹을 몇 가지 해봤는데, 여기에 게시된 가장 빠른 솔루션보다 최소 두 배, 여러 입력 길이에서 최악의 솔루션보다 3.5배 더 빠른 것 같습니다.
발신자의 책임이므로 입력 확인은 없습니다.데이터를 미리 준비하고 필요한 경우 핫패스에 지점을 배치하여 대량 처리 속도를 늦추지 않고 신속하게 데이터를 처리할 수 있습니다.
범위 연산자 C# 8.0 이상을 사용하면 다음을 수행할 수 있습니다.
Char.ToLowerInvariant(name[0]) + name[1..];
몇 개를 결합하여 체인이 가능한 확장으로 만들었습니다.공백 및 비문자 단락이 추가되었습니다.
public static string FirstLower(this string input) =>
(!string.IsNullOrWhiteSpace(input) && input.Length > 0
&& char.IsLetter(input[0]) && !char.IsLower(input[0]))
? input[0].ToString().ToLowerInvariant() + input.Remove(0, 1) : input;
이는 최신 구문과 올바른 검증을 사용하는 작은 확장 방법입니다.
public static class StringExtensions
{
public static string FirstCharToLower(this string input)
{
switch (input)
{
case null: throw new ArgumentNullException(nameof(input));
case "": throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input));
default: return input.First().ToString().ToLower() + input.Substring(1);
}
}
}
사용 방법:
string newName= name[0].ToString().ToLower() + name.Substring(1);
표현식에서 문자열을 두 번 참조하지 않으려면 다음을 사용하여 수행할 수 있습니다.System.Linq
.
new string("Hello World".Select((c, i) => i == 0 ? char.ToLower(c) : c).ToArray())
이렇게 하면 문자열이 함수에서 가져온 경우 해당 함수의 결과를 저장할 필요가 없습니다.
new string(Console.ReadLine().Select((c, i) => i == 0 ? char.ToLower(c) : c).ToArray())
사용하는 것이 더 좋습니다.String.Concat
String.Format
형식이 데이터 변경이 아니며 연결만 필요하다는 것을 알고 있는 경우.
언급URL : https://stackoverflow.com/questions/3565015/bestpractice-transform-first-character-of-a-string-into-lower-case
'programing' 카테고리의 다른 글
시스템 호출 소스 코드는 어디에서 찾을 수 있습니까? (0) | 2023.08.15 |
---|---|
백그라운드 또는 포그라운드에서 응용 프로그램을 신속하게 탐지 (0) | 2023.08.15 |
JQuery 또는 JavaScript:앵커 태그 하이퍼링크를 클릭하는 동안 시프트 키를 눌렀는지 여부를 어떻게 확인합니까? (0) | 2023.08.15 |
promise.race() 사용법 이해 (0) | 2023.08.10 |
하나의 요소에 여러 개의 데이터 바인딩 속성을 갖는 방법은 무엇입니까? (0) | 2023.08.10 |