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?

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.


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.


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);
    }
}

3

punya saya

if (!string.IsNullOrEmpty (val) && val.Length > 0)
{
    return val[0].ToString().ToLowerInvariant() + val.Remove (0,1);   
}

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".


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;
}

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;

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);
        }
    }
}

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);

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())

-3

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.