Saya ingin memiliki metode yang mengubah karakter pertama string menjadi huruf kecil.
Pendekatan saya:
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));
}
Apa pendekatan Anda?
char.ToLower(name[0]).ToString() + name.Substring(1)
+
operator lambat saat Anda menggabungkan banyak string. Dalam hal ini aStringBuilder
akan bekerja jauh lebih baik. Namun,+
jauh lebih cepat daristring.Format
. Gunakan yang terakhir ketika Anda benar-benar perlu memformat sesuatu (seperti menampilkan bilangan bulat, ganda atau tanggal).+
operator tidak akan lambat sama sekali, karena kompilator mengubahnya menjadi aString.Concat
(namunString.Join
lebih cepat daripadaString.Concat
beberapa alasan konyol).public static string ToLowerFirst(this string source) { if (string.IsNullOrWhiteSpace(source)) return source; var charArray = source.ToCharArray(); charArray[0] = char.ToLower(charArray[0]); return new string(charArray); }
Berdasarkan komentar @ MatteoMigliore.Bergantung pada situasinya, sedikit pemrograman defensif mungkin diinginkan:
public static string FirstCharacterToLower(string str) { if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0)) return str; return Char.ToLowerInvariant(str[0]) + str.Substring(1); }
The
if
pernyataan juga mencegah string baru dari yang dibangun jika itu tidak akan berubah pula. Anda mungkin ingin metode ini gagal pada input null sebagai gantinya, dan melemparArgumentNullException
.Seperti yang telah disebutkan orang, menggunakan
String.Format
untuk ini berlebihan.sumber
Untuk berjaga-jaga jika itu membantu siapa saja yang kebetulan menemukan jawaban ini.
Saya pikir ini akan menjadi yang terbaik sebagai metode ekstensi, maka Anda dapat memanggilnya dengan yourString.FirstCharacterToLower ();
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); } }
sumber
punya saya
if (!string.IsNullOrEmpty (val) && val.Length > 0) { return val[0].ToString().ToLowerInvariant() + val.Remove (0,1); }
sumber
val.Remove
? Sepertinya agak kontra-intuitif bagi saya.Saya suka jawaban yang diterima, tetapi selain memeriksa
string.IsNullOrEmpty
saya juga akan memeriksa apakahChar.IsLower(name[1])
Anda berurusan dengan singkatan. Misalnya Anda tidak ingin "AIDS" menjadi "AIDS".sumber
Solusi tercepat yang saya tahu tanpa menyalahgunakan 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; }
sumber
Menggabungkan beberapa dan menjadikannya ekstensi yang dapat dirantai. Menambahkan korsleting pada spasi dan non-huruf.
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;
sumber
Ini adalah metode ekstensi kecil yang menggunakan sintaks terbaru dan validasi yang benar
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); } } }
sumber
Gunakan ini:
string newName= name[0].ToString().ToLower() + name.Substring(1);
sumber
Jika Anda tidak ingin mereferensikan string Anda dua kali dalam ekspresi Anda, Anda dapat melakukan ini menggunakan
System.Linq
.new string("Hello World".Select((c, i) => i == 0 ? char.ToLower(c) : c).ToArray())
Dengan begitu, jika string Anda berasal dari suatu fungsi, Anda tidak perlu menyimpan hasil dari fungsi tersebut.
new string(Console.ReadLine().Select((c, i) => i == 0 ? char.ToLower(c) : c).ToArray())
sumber
Ini lebih baik digunakan
String.Concat
daripadaString.Format
jika Anda tahu bahwa format tidak mengubah data, dan hanya penggabungan yang diinginkan.sumber