BestPractice - Ubah karakter pertama dari string menjadi huruf kecil

136

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?

Rookian
sumber

Jawaban:

240

Saya akan menggunakan penggabungan sederhana:

Char.ToLowerInvariant(name[0]) + name.Substring(1)

Solusi pertama tidak dioptimalkan karena string.Formatlambat dan Anda tidak membutuhkannya jika Anda memiliki format yang tidak akan pernah berubah. Ini juga menghasilkan string tambahan untuk menyembunyikan huruf menjadi huruf kecil, yang tidak diperlukan.

Pendekatan dengan "+ 32" jelek / tidak dapat dipelihara karena memerlukan pengetahuan tentang offset nilai karakter ASCII. Ini juga akan menghasilkan keluaran yang salah dengan data Unicode dan karakter simbol ASCII.

onof
sumber
4
saya akan melakukannya:char.ToLower(name[0]).ToString() + name.Substring(1)
Andrey
7
@Rookian: +operator lambat saat Anda menggabungkan banyak string. Dalam hal ini a StringBuilderakan bekerja jauh lebih baik. Namun, +jauh lebih cepat dari string.Format. Gunakan yang terakhir ketika Anda benar-benar perlu memformat sesuatu (seperti menampilkan bilangan bulat, ganda atau tanggal).
Dirk Vollmar
6
@ 0x03: ini hanya lambat jika Anda menggabungkan banyak string secara berulang. Jika Anda menggabungkan semuanya dalam satu operasi, +operator tidak akan lambat sama sekali, karena kompilator mengubahnya menjadi a String.Concat(namun String.Joinlebih cepat daripada String.Concatbeberapa alasan konyol).
Thorarin
2
Metode yang lebih cepat adalah ini: string statis publik ToFirstLetterLower (teks string) {var charArray = text.ToCharArray (); charArray [0] = char.ToLower (charArray [0]); kembalikan string baru (charArray); }
Matteo Migliore
2
Saya menggunakan ekstensi 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.
KregHEk
64

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 ifpernyataan 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 melempar ArgumentNullException.

Seperti yang telah disebutkan orang, menggunakan String.Formatuntuk ini berlebihan.

Thorarin
sumber
Koreksi saya jika saya salah tetapi str. Substring (1) akan mengembalikan simbol pada posisi 1 karena hitungan untuk metode ini tidak ditunjukkan. jadi Anda akan memiliki char [0] dalam huruf kecil + char pada posisi 1 Jadi saya lebih suka menghapus satu char mulai dari char pertama dalam string. Hasilnya adalah string tanpa huruf pertama. Kemudian saya akan menambahkan string ini ke karakter pertama yang diubah menjadi huruf kecil
fedotoves
4
@ B-Rain: anggap diri Anda dikoreksi: msdn.microsoft.com/en-us/library/hxthx5h6%28VS.90%29.aspx
Thorarin
7

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);
    }
}
carlcheel.dll
sumber
3

punya saya

if (!string.IsNullOrEmpty (val) && val.Length > 0)
{
    return val[0].ToString().ToLowerInvariant() + val.Remove (0,1);   
}
fedotoves
sumber
3
Saya penasaran, kenapa val.Remove? Sepertinya agak kontra-intuitif bagi saya.
Thorarin
@Thorarin jelas karena Anda ingin menghapus karakter pertama (karena Anda menambahkan versi huruf kecil di depan)
Riki
2

Saya suka jawaban yang diterima, tetapi selain memeriksa string.IsNullOrEmptysaya juga akan memeriksa apakah Char.IsLower(name[1])Anda berurusan dengan singkatan. Misalnya Anda tidak ingin "AIDS" menjadi "AIDS".

Slobodan Savkovic
sumber
8
IMO ini adalah tanggung jawab penelepon
mulai
1

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;
}
Rjz
sumber
0

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;
Randy Buchholz
sumber
0

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);
        }
    }
}
Carlos Muñoz
sumber
1
Tidak yakin apakah memberikan pengecualian akan menjadi solusi terbaik. Apakah stringnya null atau kosong, kembalikan string null atau kosong saja.
R. de Veen
Jika String kosong atau kosong, operasi tidak masuk akal karena tidak ada karakter pertama yang diubah menjadi huruf kecil.
Carlos Muñoz
0

Gunakan ini:

string newName= name[0].ToString().ToLower() + name.Substring(1);
hojjat.mi
sumber
0

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())
Samuel Cabrera
sumber
-3

Ini lebih baik digunakan String.Concatdaripada String.Formatjika Anda tahu bahwa format tidak mengubah data, dan hanya penggabungan yang diinginkan.

Konstantin Isaev
sumber