Buat huruf pertama dari huruf besar (dengan kinerja maksimum)


447

Aku punya DetailsViewdengan TextBox dan saya ingin input data akan disimpan selalu dengan PERTAMA SURAT MODAL.

Contoh:

"red" --> "Red"
"red house" --> " Red house"

Bagaimana saya bisa mencapai kinerja yang memaksimalkan ini ?


CATATAN :
Berdasarkan jawaban dan komentar di bawah jawaban, banyak orang berpikir ini menanyakan tentang menggunakan huruf besar semua kata dalam string. Misalnya => Red House Hal ini tidak, tetapi jika itu adalah apa yang Anda cari , mencari salah satu jawaban yang menggunakan TextInfo's ToTitleCasemetode. (CATATAN: Jawaban-jawaban itu tidak benar untuk pertanyaan yang sebenarnya diajukan.)
Lihat TextInfo.ToTitleCase doc untuk peringatan (tidak menyentuh kata-kata serba - mereka dianggap akronim; dapat huruf kecil di tengah kata-kata yang "tidak boleh" menjadi diturunkan, mis. "McDonald" => "Mcdonald"; tidak dijamin untuk menangani semua seluk beluk budaya spesifik terkait aturan kapitalisasi.)


CATATAN :
Pertanyaannya adalah ambigu apakah huruf setelah yang pertama harus dipaksa untuk menurunkan kasus . Jawaban yang diterima mengasumsikan bahwa hanya huruf pertama yang harus diubah . Jika Anda ingin memaksa semua huruf dalam string kecuali huruf pertama menjadi huruf kecil, cari jawaban yang berisi ToLower, dan tidak mengandung ToTitleCase .


7
@ Bobby: Ini bukan duplikat: OP meminta untuk menggunakan huruf besar dari sebuah string, pertanyaan dalam tautan menggunakan huruf kapital untuk huruf pertama dari setiap kata.
GvS

1
@ GvS: Jawaban pertama sangat rinci dan kode-blok pertama adalah persis apa yang dia cari. Selain itu, antara menggunakan huruf besar untuk setiap kata dan hanya kata pertama hanya satu perbedaan loop.
Bobby

Apakah Anda pernah berhasil menyelesaikan ini? Apakah Anda masih membutuhkan bantuan dengan ini?
jcolebrand

1
Tapi Anda berkata, dan saya kutip, "Buat huruf pertama dari SETIAP KATA huruf besar". Karena itu, mengapa "rumah merah" -> "rumah merah"? Mengapa "h" dari "rumah" bukan huruf kapital?
Guillermo Gutiérrez

Menambahkan jawaban karena sebagian besar jawaban akan gagal jika Anda memiliki ruang putih di awal. untuk menghindari memposting ini pada setiap jawaban, saya akan mempostingnya di sini sekali.
Noctis

Jawaban:


583

Diperbarui ke C # 8

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input) =>
        input switch
        {
            null => throw new ArgumentNullException(nameof(input)),
            "" => throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)),
            _ => input.First().ToString().ToUpper() + input.Substring(1)
        };
}

C # 7

public static class StringExtensions
{
    public static string FirstCharToUpper(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().ToUpper() + input.Substring(1);
        }
    }
}

Jawaban yang benar-benar tua

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + String.Join("", input.Skip(1));
}

EDIT : Versi ini lebih pendek. Untuk solusi yang lebih cepat lihat jawaban Equiso

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + input.Substring(1);
}

EDIT 2 : Mungkin solusi tercepat adalah Darren (Bahkan ada tolok ukur) walaupun saya akan mengubah string.IsNullOrEmpty(s)validasinya untuk membuang pengecualian karena persyaratan asli mengharapkan huruf pertama ada sehingga dapat ditulis dalam huruf besar. Perhatikan bahwa kode ini berfungsi untuk string generik dan tidak terutama pada nilai yang valid dari Textbox.


2
Karena parameter pertama String.Joinadalah pemisah yang digunakan untuk menggabungkan string yang diberikan dengan parameter kedua.
Dialecticus

27
Saya sangat suka jawaban Anda, tetapi var arr = input.ToCharArray(); arr[0] = Char.ToUpperInvariant(arr[0]); return new String(arr);mungkin akan mendapatkan beberapa kecepatan karena Anda membuat objek yang kurang abadi (dan terutama Anda melewatkan String.Join). Ini tentu saja tergantung pada panjang senarnya.
flindeberg

3
Luar Biasa - Menggunakan Linq membuatnya sangat jelas apa yang dilakukan kode ini.
Daniel James Bryars

7
Hmmm ... Secara teknis, ini harus kembali "Argh!"sesuai dengan aturan Huruf Pertama Huruf Besar . ;)
jp2code

2
@ jp2code Karena mengkapitalisasi huruf pertama yang tidak ada dalam string nol atau kosong seperti ditampar oleh dolphing yang hamil, maka ALL CAPS ARGH! adalah ejaan yang benar. urbandictionary.com/define.php?term=ARGH&defid=67839
Carlos Muñoz

319
public string FirstLetterToUpper(string str)
{
    if (str == null)
        return null;

    if (str.Length > 1)
        return char.ToUpper(str[0]) + str.Substring(1);

    return str.ToUpper();
}

Jawaban lama: Ini membuat setiap huruf pertama menjadi huruf besar

public string ToTitleCase(string str)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
}

Tapi ini mengubah setiap huruf pertama dari sebuah kata menjadi huruf besar, tidak hanya karakter pertama dari sebuah string.
GvS

@ GVS, itulah yang diminta pertanyaan Anda lakukan.
thattolleyguy

17
Dia bertanya "rumah merah" => "Rumah merah". ToTitleCase akan memberi Anda "Gedung Merah".
GvS

1
membantu saya. Hebat
Ehsan Sajjad

1
Tidak yakin tentang ini tetapi char + string menyebabkan tinju. Hanya dalam kasus max kinerja adalah persyaratan.
nawfal

163

Cara yang benar adalah dengan menggunakan Budaya:

System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word.ToLower())

Catatan: Ini akan menggunakan huruf besar untuk setiap kata dalam string, mis. "Rumah merah" -> "Rumah Merah". Solusinya juga akan mengurangi penggunaan huruf besar dalam kata-kata, misalnya "McDonald lama" -> "Mcdonald Lama".


4
Ini adalah cara yang paling tepat untuk melakukannya daripada menemukan kembali roda dan mencoba untuk menulis versi Anda sendiri ini.
Alexey Shevelyov

12
Masalah yang saya miliki dengan ini adalah bahwa itu akan menghapus huruf kapital yang berpotensi valid yang mid-string. mis. McNames
Jecoms

29
Ini adalah jawaban yang salah karena "rumah merah" menjadi "Rumah Merah" (perhatikan "H")!
spaark

21
Enam tahun setelah pertanyaan diajukan, silakan lakukan pekerjaan yang lebih menyeluruh untuk membaca jawaban yang ada dan komentar mereka . Jika Anda yakin Anda memiliki solusi yang lebih baik, maka tunjukkan situasi di mana jawaban Anda berperilaku dengan cara yang Anda anggap lebih unggul, dan secara khusus bagaimana itu berbeda dari jawaban yang ada. 1) Equiso sudah membahas opsi ini, di paruh kedua jawabannya. 2) Untuk banyak situasi, ToLoweradalah kesalahan, karena menghapus huruf besar di tengah kata, misalnya "McDonalds". 3) Pertanyaannya adalah tentang mengubah hanya kata pertama dari string , bukan tentang TitleCase.
ToolmakerSteve

10
Ini mengubah input menjadi "Judul Kasus" - sehingga mengubah "kuda merah" menjadi "Kuda Merah" - sementara orang yang bertanya secara eksplisit menyatakan bahwa ia TIDAK boleh melakukan ini (dan mengembalikan "kuda merah"). Ini bukan cara yang benar.
Hekkaryk

68

Saya mengambil metode tercepat dari http://www.dotnetperls.com/uppercase-first-letter dan dikonversi ke metode ekstensi:

    /// <summary>
    /// Returns the input string with the first character converted to uppercase, or mutates any nulls passed into string.Empty
    /// </summary>
    public static string FirstLetterToUpperCaseOrConvertNullToEmptyString(this string s)
    {
        if (string.IsNullOrEmpty(s))
            return string.Empty;

        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }

CATATAN: Alasan menggunakan ToCharArraylebih cepat daripada alternatif char.ToUpper(s[0]) + s.Substring(1), adalah bahwa hanya satu string yang dialokasikan, sedangkan Substringpendekatan mengalokasikan string untuk substring, kemudian string kedua untuk menyusun hasil akhir.


EDIT : Berikut ini pendekatannya, dikombinasikan dengan tes awal dari CarlosMuñoz jawaban yang diterima :

    /// <summary>
    /// Returns the input string with the first character converted to uppercase
    /// </summary>
    public static string FirstLetterToUpperCase(this string s)
    {
        if (string.IsNullOrEmpty(s))
            throw new ArgumentException("There is no first letter");

        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }

Wow, terima kasih telah menemukan metrik kinerja, untuk menunjukkan solusi kinerja unggul!
ToolmakerSteve

@ToolmakerSteve, saya suka solusi ini karena memang sepertinya lebih cepat daripada yang lain tapi ada sedikit masalah dengan ini. Jika Anda lulus nol, Anda seharusnya tidak mendapatkan string kosong sebagai output. Bahkan saya berpendapat bahwa bahkan melewati string kosong harus mengeluarkan pengecualian karena OP meminta huruf pertama . Anda juga dapat mengomentari jawaban orang lain sebelum mengeditnya.
Carlos Muñoz

@ CarlosMuñoz - sudah dibahas dalam meta, apakah akan "meningkatkan" jawaban orang lain. Konsensusnya adalah "jika Anda dapat meningkatkan jawaban, maka lakukan - tidak ada yang 'memiliki' jawaban, bahkan bukan penulis asli - tujuannya adalah untuk mendapatkan jawaban terbaik". Anda tentu saja bebas untuk mengedit atau mengembalikan hasil edit. Dalam hal ini, kesopanan umum akan membiarkan versi penulis asli menjadi hasil akhir, dan saya akan setuju untuk berkomentar. Biasanya saya juga memberi komentar tentang perubahan yang saya buat; Saya minta maaf jika saya tidak melakukannya.
ToolmakerSteve

@ CarlosMuñoz - khususnya, ada banyak, banyak jawaban dalam SO, yang tidak dipelihara secara aktif. Jika suatu perubahan akan meningkatkan jawaban, mengapa membiarkannya terkubur dalam komentar? Jika penulis secara aktif memantau jawaban mereka, mereka akan melakukan perubahan sesuai keinginan mereka. Jika tidak, maka jawabannya telah ditingkatkan, untuk kepentingan semua orang. Prinsip ini terutama benar, untuk Tanya Jawab lama, seperti yang ini.
ToolmakerSteve

BTW, saya setuju dengan @ CarlosMuñoz tentang tes di awal metode - versinya dari tes itu adalah gaya pemrograman yang lebih baik - di return string.Emptysini akan menyembunyikan panggilan "buruk" ke metode.
ToolmakerSteve

46

Anda dapat menggunakan "metode ToTitleCase"

string s = new CultureInfo("en-US").TextInfo.ToTitleCase("red house");
//result : Red House

metode perluasan ini menyelesaikan setiap masalah titlecase.

mudah digunakan

string str = "red house";
str.ToTitleCase();
//result : Red house

string str = "red house";
str.ToTitleCase(TitleCase.All);
//result : Red House

metode Extention

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace Test
{
    public static class StringHelper
    {
        private static CultureInfo ci = new CultureInfo("en-US");
        //Convert all first latter
        public static string ToTitleCase(this string str)
        {
            str = str.ToLower();
            var strArray = str.Split(' ');
            if (strArray.Length > 1)
            {
                strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                return string.Join(" ", strArray);
            }
            return ci.TextInfo.ToTitleCase(str);
        }
        public static string ToTitleCase(this string str, TitleCase tcase)
        {
            str = str.ToLower();
            switch (tcase)
            {
                case TitleCase.First:
                    var strArray = str.Split(' ');
                    if (strArray.Length > 1)
                    {
                        strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                        return string.Join(" ", strArray);
                    }
                    break;
                case TitleCase.All:
                    return ci.TextInfo.ToTitleCase(str);
                default:
                    break;
            }
            return ci.TextInfo.ToTitleCase(str);
        }
    }

    public enum TitleCase
    {
        First,
        All
    }
}

Masalah dengan solusi Anda adalah bahwa "rumah merah" akan dikonversi menjadi "Rumah Merah" dan bukan ke "Rumah Merah" seperti yang ditanyakan dalam pertanyaan.
Vadim

3
@Tacttin Ini akan bekerja tetapi kode berikut lebih mudah untuk membaca dan melakukan char.ToUpper yang lebih baik (teks [0]) + ((teks. Panjang> 1)? Teks. Substring (1) .ToLower (): string.Empty) ; Anda dapat membaca lebih lanjut @ vkreynin.wordpress.com/2013/10/09/...
Vadim

1
Saya tidak suka solusi ini, karena menggabungkan dua situasi yang sangat berbeda menjadi satu metode yang panjang. Saya juga tidak melihat manfaat konseptual. Dan penerapan huruf kapital hanya huruf pertama adalah .. konyol. Jika Anda ingin menggunakan huruf besar untuk huruf pertama, implementasi yang jelas adalah dengan menggunakan huruf besar (ToUpper) huruf pertama . Alih-alih ini, saya akan memiliki dua metode terpisah. FirstLetterToUpperdalam jawaban Equiso (atau dalam jawaban Guillernet yang lebih baru), dan di ToTitleCasesini, tetapi tanpa parameter kedua. Maka tidak perlu enum TitleCase.
ToolmakerSteve

31

Untuk huruf pertama, dengan pengecekan error:

public string CapitalizeFirstLetter(string s)
{
    if (String.IsNullOrEmpty(s))
        return s;
    if (s.Length == 1)
        return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
}

Dan ini sama dengan ekstensi yang berguna

public static string CapitalizeFirstLetter(this string s)
    {
    if (String.IsNullOrEmpty(s)) return s;
    if (s.Length == 1) return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
    }

Pendekatan bersih. Terima kasih!
Philippe

11
public static string ToInvarianTitleCase(this string self)
{
    if (string.IsNullOrWhiteSpace(self))
    {
        return self;
    }

    return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(self);
}

6

Jika penggunaan kinerja / memori adalah masalah maka, ini hanya membuat satu (1) StringBuilder dan satu (1) String baru dengan ukuran yang sama dengan string Asli.

public static string ToUpperFirst(this string str) {
  if( !string.IsNullOrEmpty( str ) ) {
    StringBuilder sb = new StringBuilder(str);
    sb[0] = char.ToUpper(sb[0]);

    return sb.ToString();

  } else return str;
}

3
Ini bisa dilakukan dengan sederhana char[]daripada memiliki semua infrastruktur yang StringBuildermembungkusnya. Alih-alih new StringBuilder(str), gunakan str.ToCharArray(), dan bukannya sb.ToString(), gunakan new string(charArray). StringBuildermengemulasi jenis pengindeksan yang diekspos oleh array karakter secara asli, sehingga .ToUpperbaris aktual pada dasarnya bisa sama. :-)
Jonathan Gilbert

Darren (setahun kemudian) menunjukkan cara melakukan ini menggunakan ToCharArray, seperti yang disarankan oleh @JonathanGilbert
ToolmakerSteve

6

Metode tercepat.

  private string Capitalize(string s){
        if (string.IsNullOrEmpty(s))
        {
            return string.Empty;
        }
        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
}

Tes menunjukkan hasil selanjutnya (string dengan 10000000 simbol sebagai input): Hasil tes


1
Saya sarankan mengembalikan sparameter ketika nol atau kosong.
MatrixRonny

4

Coba ini:

static public string UpperCaseFirstCharacter(this string text) {
    return Regex.Replace(text, "^[a-z]", m => m.Value.ToUpper());
}

2
atau mungkin beberapa kelas karakter lain (yaitu alfanumerik \ w), sehingga fungsinya adalah unicode-aware
Dmitry Ledentsov

@ DmitryLedentsov- C # string class dibangun di atas karakter UTF-16. Kelas String "Merupakan teks sebagai urutan unit kode UTF-16."
ToolmakerSteve

4

Jika Anda hanya peduli dengan huruf pertama yang ditulis dengan huruf besar dan tidak masalah dengan sisa string Anda cukup memilih karakter pertama, buat huruf besar dan gabungkan dengan sisa string tanpa karakter pertama yang asli.

String word ="red house";
word = word[0].ToString().ToUpper() + word.Substring(1, word.length -1);
//result: word = "Red house"

Kita perlu mengonversi karakter pertama ToString () karena kita membacanya sebagai array Char, dan tipe Char tidak memiliki metode ToUpper ().


3

Berikut cara untuk melakukannya sebagai metode ekstensi:

static public string UpperCaseFirstCharacter(this string text)
{
    if (!string.IsNullOrEmpty(text))
    {
        return string.Format(
            "{0}{1}",
            text.Substring(0, 1).ToUpper(),
            text.Substring(1));
    }

    return text;
}

Kemudian bisa disebut seperti:

//yields "This is Brian's test.":
"this is Brian's test.".UpperCaseFirstCharacter(); 

Dan inilah beberapa unit test untuknya:

[Test]
public void UpperCaseFirstCharacter_ZeroLength_ReturnsOriginal()
{
    string orig = "";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual(orig, result);
}

[Test]
public void UpperCaseFirstCharacter_SingleCharacter_ReturnsCapital()
{
    string orig = "c";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual("C", result);
}

[Test]
public void UpperCaseFirstCharacter_StandardInput_CapitalizeOnlyFirstLetter()
{
    string orig = "this is Brian's test.";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual("This is Brian's test.", result);
}

1
string.Formatberlebihan; lakukan saja text.Substring(0, 1).ToUpper() + text.Substring(1).
ToolmakerSteve

3

Karena saya kebetulan sedang mengerjakan ini juga, dan mencari-cari ide, inilah solusi yang saya dapatkan. Ini menggunakan LINQ, dan akan dapat menggunakan huruf besar untuk huruf pertama dari string, bahkan jika kemunculan pertama bukanlah huruf. Inilah metode ekstensi yang akhirnya saya buat.

public static string CaptalizeFirstLetter(this string data)
{
    var chars = data.ToCharArray();

    // Find the Index of the first letter
    var charac = data.First(char.IsLetter);
    var i = data.IndexOf(charac);

    // capitalize that letter
    chars[i] = char.ToUpper(chars[i]);

    return new string(chars);
}

Saya yakin ada cara untuk mengoptimalkan atau membersihkan ini sedikit.


3

Saya menemukan sesuatu di sini http://www.dotnetperls.com/uppercase-first-letter :

static string UppercaseFirst(string s)
{
// Check for empty string.
if (string.IsNullOrEmpty(s))
{
    return string.Empty;
}
// Return char and concat substring.
return char.ToUpper(s[0]) + s.Substring(1);
}

mungkin ini bisa membantu !!


Bagaimana ini merupakan perbaikan atas jawaban Equiso 4 tahun sebelumnya?
ToolmakerSteve

3

Periksa apakah string bukan nol, lalu konversi karakter pertama ke huruf besar dan sisanya menjadi huruf kecil:

public static string FirstCharToUpper(string str)
{
    return str?.First().ToString().ToUpper() + str?.Substring(1).ToLower();
}

Terima kasih atas solusi kecil alih-alih beberapa baris kode hanya untuk kata string!
Imran Faruqi

2

Ini akan melakukannya walaupun itu juga akan memastikan bahwa tidak ada modal yang salah yang tidak ada di awal kata.

public string(string s)
{
System.Globalization.CultureInfo c = new System.Globalization.CultureInfo("en-us", false)
System.Globalization.TextInfo t = c.TextInfo;

return t.ToTitleCase(s);
}

2
Membutuhkan pemeriksaan nol ssebelum panggilan ke ToTitleCase.
Taras Alenin

@ CarlosMuñoz tlhIngan Hol tidak memiliki casing surat dalam skripnya. :-)
Jonathan Gilbert

2

Tampaknya ada banyak kerumitan di sini ketika yang Anda butuhkan adalah:

    /// <summary>
    /// Returns the input string with the first character converted to uppercase if a letter
    /// </summary>
    /// <remarks>Null input returns null</remarks>
    public static string FirstLetterToUpperCase(this string s)
    {
        if (string.IsNullOrWhiteSpace(s))
            return s;

        return char.ToUpper(s[0]) + s.Substring(1);
    }

Poin penting:

  1. Ini merupakan metode ekstensi.

  2. Jika inputnya nol, kosong atau kosong, maka input akan dikembalikan apa adanya.

  3. String.IsNullOrWhiteSpace diperkenalkan dengan .NET Framework 4. Ini tidak akan bekerja dengan kerangka kerja yang lebih lama.


1
Saya tidak melihat bagaimana ini merupakan peningkatan pada jawaban asli yang diterima dari empat tahun lalu. Sebenarnya, itu tidak konsisten (tidak berbahaya, tetapi empat tahun terlambat, saya memiliki standar tinggi untuk jawaban baru yang menambah manfaat): Satu-satunya manfaat menggunakan yang lebih baru IsNullOrWhiteSpacedaripada IsNullOrEmpty, adalah jika Anda akan menemukan dan mengubah yang pertama ruang putih . Tapi Anda tidak - Anda selalu beroperasi s[0]. Jadi tidak ada gunanya [baik secara semantik maupun kinerja] untuk digunakan IsNullOrWhiteSpace.
ToolmakerSteve

... mengapa penggunaan IsNullOrWhiteSpacemasalah ini membuat saya, adalah bahwa pembaca yang ceroboh mungkin berpikir "Dia memeriksa ruang putih, jadi kode berikut ini benar-benar menemukan dan mengubah huruf, bahkan jika itu didahului oleh ruang putih". Karena kode Anda akan gagal mengubah huruf "pertama" yang diawali dengan spasi, penggunaan IsNullOrWhiteSpacehanya dapat menyesatkan pembaca.
ToolmakerSteve

... oops, maksudku bukan jawaban yang diterima, maksudku jawaban Equiso dari periode waktu yang sama.
ToolmakerSteve

1
string emp="TENDULKAR";
string output;
output=emp.First().ToString().ToUpper() + String.Join("", emp.Skip(1)).ToLower();

Mengapa ToLower () di bagian ekor ?. Tidak ada persyaratan untuk surat lain kecuali yang pertama.
Carlos Muñoz

Stringadalah bisa apa saja Upperatau Lowerjadi solusi generik untuk semua string.
Shailesh

Kenapa Joinbukannya emp.First().ToString().ToUpper() + emp.Substring(1);? Mungkin perlu lebih defensif juga: output = string.IsNullOrEmpty(emp) ? string.Empty : [...]. Juga, fwiw, setuju dengan @ CarlosMuñoz - Anda tidak perlu ToLower()untuk pertanyaan OP.
ruffin

@Ruffin -> menggunakan Substring juga gaya penulisan kode yang baik, saya setuju solusi Anda untuk memangkas kode tetapi dalam hal ini menulis ToLower()adalah praktik pemrograman yang baik. stringbisa apa saja Dalam Upperkasus atau Lowerkasus tergantung pada input pengguna, saya memberikan solusi generik.
Shailesh

@ Shailesh - Namun, pertanyaannya tidak meminta hanya huruf pertama yang menjadi modal. Ia meminta agar huruf pertama diubah menjadi modal. Tanpa klarifikasi lebih lanjut dari penulis, asumsi paling alami adalah bahwa sisa string tidak berubah. Mengingat Anda menjawab tiga tahun kemudian , silakan asumsikan bahwa jawaban yang diterima melakukan apa yang diminta penanya. Berikan jawaban yang berbeda hanya jika ada alasan teknis untuk melakukannya secara berbeda.
ToolmakerSteve

1

Saya ingin memberikan jawaban "KINERJA MAKSIMUM". Dalam pikiran saya, jawaban "KINERJA MAKSIMUM" menangkap semua skenario dan memberikan jawaban untuk pertanyaan akuntansi untuk skenario tersebut. Jadi, inilah jawaban saya. Dengan alasan ini:

  1. Akun IsNullOrWhiteSpace untuk string yang hanya spasi atau null / kosong.
  2. .Trim () menghapus spasi putih dari depan dan belakang string.
  3. .First () mengambil karakter pertama dari sebuah ienumerable (atau string).
  4. Kita harus memeriksa untuk melihat apakah itu huruf yang dapat / harus ditulis dalam huruf besar.
  5. Kami kemudian menambahkan sisa string, hanya jika panjang menunjukkan kita harus.
  6. Dengan praktik terbaik .Net, kami harus menyediakan budaya di bawah System.Globalization.CultureInfo.
  7. Memberikannya sebagai parameter opsional membuat metode ini benar-benar dapat digunakan kembali, tanpa harus mengetik budaya yang dipilih setiap saat.

    public static string capString(string instring, string culture = "en-US", bool useSystem = false)
    {
        string outstring;
        if (String.IsNullOrWhiteSpace(instring))
        {
            return "";
        }
        instring = instring.Trim();
        char thisletter = instring.First();
        if (!char.IsLetter(thisletter))
        {
            return instring;   
        }
        outstring = thisletter.ToString().ToUpper(new CultureInfo(culture, useSystem));
        if (instring.Length > 1)
        {
            outstring += instring.Substring(1);
        }
        return outstring;
    }

2
Meskipun ini mencakup sebagian besar kasus, bukankah akan lebih lambat mengingat jumlah string yang dibuat dengan setiap operasi? Ada banyak alokasi string yang terjadi di sini. Lebih disukai itu akan dialokasikan satu kali, dan hanya sekali.
Douglas Gaskell

1

Baru-baru ini saya memiliki persyaratan yang sama dan ingat bahwa fungsi LINQ Select () memberikan indeks:

string input;
string output;

input = "red house";
output = String.Concat(input.Select((currentChar, index) => index == 0 ? Char.ToUpper(currentChar) : currentChar));
//output = "Red house"

Karena saya sangat membutuhkannya, saya membuat metode ekstensi untuk tipe string:

public static class StringExtensions
{
    public static string FirstLetterToUpper(this string input)
    {
        if (string.IsNullOrEmpty(input))
            return string.Empty;
        return String.Concat(input.Select((currentChar, index) => index == 0 ? Char.ToUpper(currentChar) : currentChar));
    }
}

Harap dicatat bahwa hanya huruf pertama yang dikonversi menjadi huruf besar - semua karakter yang tersisa tidak tersentuh. Jika Anda membutuhkan karakter lain menjadi huruf kecil, Anda juga dapat memanggil Char.ToLower (currentChar) untuk indeks> 0 atau panggil ToLower () pada seluruh string di tempat pertama.

Mengenai kinerja saya membandingkan kode dengan solusi dari Darren. Di komputer saya, kode Darren sekitar 2 kali lebih cepat yang tidak mengejutkan karena dia langsung mengedit hanya huruf pertama dalam array char. Jadi saya sarankan Anda mengambil kode Darren jika Anda membutuhkan solusi tercepat yang tersedia. Jika Anda ingin mengintegrasikan manipulasi string lain juga mungkin nyaman untuk memiliki kekuatan ekspresif fungsi lambda menyentuh karakter dari string input - Anda dapat dengan mudah memperluas fungsi ini - jadi saya meninggalkan solusi ini di sini.


Saya bertanya-tanya bagaimana saya akan menyelesaikan masalah ini, mencari solusi sendiri, kemudian kembali mempostingnya hanya untuk menemukan Anda telah menemukan solusi yang sama persis dengan yang saya miliki. Memberi +1 kepada Anda!
BlueFuzzyThing

Terima kasih banyak.
Grimm

1

Saya pikir metode di bawah ini adalah solusi terbaik

    class Program
{
    static string UppercaseWords(string value)
    {
        char[] array = value.ToCharArray();
        // Handle the first letter in the string.
        if (array.Length >= 1)
        {
            if (char.IsLower(array[0]))
            {
                array[0] = char.ToUpper(array[0]);
            }
        }
        // Scan through the letters, checking for spaces.
        // ... Uppercase the lowercase letters following spaces.
        for (int i = 1; i < array.Length; i++)
        {
            if (array[i - 1] == ' ')
            {
                if (char.IsLower(array[i]))
                {
                    array[i] = char.ToUpper(array[i]);
                }
            }
        }
        return new string(array);
    }

    static void Main()
    {
        // Uppercase words in these strings.
        const string value1 = "something in the way";
        const string value2 = "dot net PERLS";
        const string value3 = "String_two;three";
        const string value4 = " sam";
        // ... Compute the uppercase strings.
        Console.WriteLine(UppercaseWords(value1));
        Console.WriteLine(UppercaseWords(value2));
        Console.WriteLine(UppercaseWords(value3));
        Console.WriteLine(UppercaseWords(value4));
    }
}

Output

Something In The Way
Dot Net PERLS
String_two;three
 Sam

ref


1

Karena pertanyaan ini adalah tentang memaksimalkan kinerja, saya mengadopsi versi Darren untuk digunakan Span, yang mengurangi sampah dan meningkatkan kecepatan sekitar 10%.

        /// <summary>
        /// Returns the input string with the first character converted to uppercase
        /// </summary>
        public static string ToUpperFirst(this string s)
        {
            if (string.IsNullOrEmpty(s))
                throw new ArgumentException("There is no first letter");

            Span<char> a = stackalloc char[s.Length];
            s.AsSpan(1).CopyTo(a.Slice(1));
            a[0] = char.ToUpper(s[0]);
            return new string(a);
        }

Performa

|  Method |      Data |      Mean |     Error |    StdDev |
|-------- |---------- |----------:|----------:|----------:|
|  Carlos |       red | 107.29 ns | 2.2401 ns | 3.9234 ns |
|  Darren |       red |  30.93 ns | 0.9228 ns | 0.8632 ns |
| Marcell |       red |  26.99 ns | 0.3902 ns | 0.3459 ns |
|  Carlos | red house | 106.78 ns | 1.9713 ns | 1.8439 ns |
|  Darren | red house |  32.49 ns | 0.4253 ns | 0.3978 ns |
| Marcell | red house |  27.37 ns | 0.3888 ns | 0.3637 ns |

Kode uji lengkap

using System;
using System.Linq;

using BenchmarkDotNet.Attributes;

namespace CorePerformanceTest
{
    public class StringUpperTest
    {
        [Params("red", "red house")]
        public string Data;

        [Benchmark]
        public string Carlos() => Data.Carlos();

        [Benchmark]
        public string Darren() => Data.Darren();

        [Benchmark]
        public string Marcell() => Data.Marcell();
    }

    internal static class StringExtensions
    {
        public static string Carlos(this string input) =>
            input switch
            {
                null => throw new ArgumentNullException(nameof(input)),
                "" => throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)),
                _ => input.First().ToString().ToUpper() + input.Substring(1)
            };

        public static string Darren(this string s)
        {
            if (string.IsNullOrEmpty(s))
                throw new ArgumentException("There is no first letter");

            char[] a = s.ToCharArray();
            a[0] = char.ToUpper(a[0]);
            return new string(a);
        }

        public static string Marcell(this string s)
        {
            if (string.IsNullOrEmpty(s))
                throw new ArgumentException("There is no first letter");

            Span<char> a = stackalloc char[s.Length];
            s.AsSpan(1).CopyTo(a.Slice(1));
            a[0] = char.ToUpper(s[0]);
            return new string(a);
        }
    }

}

Sunting: Ada typeo, bukannya s [0], adalah [0] - hasil ini dengan cupying sama, nilai kosong untuk Rentang yang dialokasikan a.


0

Huruf ini menjadi huruf kapital pertama dan setiap huruf setelah spasi dan huruf kecil huruf lainnya.

public string CapitalizeFirstLetterAfterSpace(string input)
{
    System.Text.StringBuilder sb = new System.Text.StringBuilder(input);
    bool capitalizeNextLetter = true;
    for(int pos = 0; pos < sb.Length; pos++)
    {
        if(capitalizeNextLetter)
        {
            sb[pos]=System.Char.ToUpper(sb[pos]);
            capitalizeNextLetter = false;
        }
        else
        {
            sb[pos]=System.Char.ToLower(sb[pos]);
        }

        if(sb[pos]=' ')
        {
            capitalizeNextLetter=true;
        }
    }
}

1
Atau jika Anda tidak ingin menulis dinding kode - CultureInfo.CurrentCulture.TextInfo.ToTitleCase (theString); melakukan hal yang sama.
Chev

Ya ... Saya tidak tahu tentang itu :) Dan karena sejumlah besar kode saya, jawaban semua orang muncul ketika saya masih mengetik.
thattolleyguy

UPVOTED: 1) Sedikit perbedaan antara jawaban ini dan ToTitleCase, adalah bahwa jawaban ini memaksa kata-kata yang semuanya huruf besar untuk menjadi TitleCase, sedangkan ToTitleCase meninggalkan kata-kata seperti itu sendiri (dengan asumsi mereka mungkin akronim). Ini mungkin atau mungkin bukan yang diinginkan. Keuntungan memiliki contoh kode seperti ini, adalah dapat dimodifikasi sesuai keinginan. 2) ini tidak akan menangani ruang putih selain '' dengan benar. harus mengganti tes kosong dengan tes ruang putih.
ToolmakerSteve

0

Gunakan kode berikut:

string  strtest ="PRASHANT";
strtest.First().ToString().ToUpper() + strtest.Remove(0, 1).ToLower();

Bahkan tidak ada gunanya bagi perwakilan saya untuk menurunkan jawaban ini ditambahkan tahun kemudian, yang jelas setara dengan jawaban yang sudah ada. Jika Anda akan menambahkan jawaban baru ke pertanyaan dengan banyak jawaban, tolong jelaskan apa yang Anda yakini lebih unggul dari jawaban Anda, atau dalam situasi apa jawaban Anda akan lebih berguna daripada jawaban lainnya. Lebih spesifik.
ToolmakerSteve

0

Sepertinya tidak ada solusi yang diberikan di sini akan berurusan dengan ruang putih sebelum string.

Hanya menambahkan ini sebagai pemikiran:

public static string SetFirstCharUpper2(string aValue, bool aIgonreLeadingSpaces = true)
{
    if (string.IsNullOrWhiteSpace(aValue))
        return aValue;

    string trimmed = aIgonreLeadingSpaces 
           ? aValue.TrimStart() 
           : aValue;

    return char.ToUpper(trimmed[0]) + trimmed.Substring(1);
}   

Seharusnya menangani this won't work on other answers(kalimat itu memiliki spasi di awal), dan jika Anda tidak suka pemangkasan ruang, cukup berikan falseparameter sebagai kedua (atau ubah ke default false, dan berikan truejika Anda ingin berurusan dengan spasi)



0

Cara termudah untuk Memanfaatkan huruf pertama adalah:

1- Menggunakan Sytem.Globalisasi;

  // Creates a TextInfo based on the "en-US" culture.
  TextInfo myTI = new CultureInfo("en-US",false).

  myTI.ToTitleCase(textboxname.Text)

`


1
Jawaban ini pada dasarnya identik dengan jawaban yang diberikan tahun sebelumnya. Itu tidak menambah diskusi.
ToolmakerSteve

Itu juga salah, sama seperti komentar di yang lain, ini mengubah setiap huruf pertama dengan semua kata modal bukan Rumah Merah dan bukan Rumah Merah.
DeadlyChambers

0

fungsi berikut ini benar untuk semua cara:

static string UppercaseWords(string value)
{
    char[] array = value.ToCharArray();
    // Handle the first letter in the string.
    if (array.Length >= 1)
    {
        if (char.IsLower(array[0]))
        {
            array[0] = char.ToUpper(array[0]);
        }
    }
    // Scan through the letters, checking for spaces.
    // ... Uppercase the lowercase letters following spaces.
    for (int i = 1; i < array.Length; i++)
    {
        if (array[i - 1] == ' ')
        {
            if (char.IsLower(array[i]))
            {
                array[i] = char.ToUpper(array[i]);
            }
        }
    }
    return new string(array);
}

Saya menemukan itu di sini


Mengapa? Mengapa menambahkan jawaban lain ketika sudah ada begitu banyak jawaban yang tampak serupa? Apa yang salah dengan semua jawaban yang ada, yang mendorong Anda untuk menambahkan yang lain?
ToolmakerSteve

Karena answare ini benar untuk semua cara. Santai saja.

Saya menyesal; Saya tidak perlu bersikap kasar. Saya akan berpegang pada fakta: 1) Ini pada dasarnya sama dengan jawaban thattolleyguy tujuh tahun sebelumnya. 2) Ini memiliki kelemahan yang sama dengan jawaban itu: tidak menangani spasi selain karakter kosong. 3) Ini menjawab pertanyaan yang sedikit berbeda dari yang ditanyakan OP. Gunakan jawaban seperti ini jika Anda ingin semua kata memiliki huruf kapital pertama. 4) Biasanya, cara paling sederhana untuk mencapai itu adalah dengan menggunakan TitleInfo.ToTitleCase. (Di sisi lain, keuntungan dari sampel kode adalah dapat disesuaikan sesuai keinginan.)
ToolmakerSteve

Memperbaiki diri sendiri: Ini berbeda dari pendekatan thattolleyguy: ia meninggalkan huruf-huruf yang tidak tersentuh yang bukan huruf pertama dari kata itu. Sebaliknya, itu adalah duplikat dari jawaban zamoldar . Untungnya, pujian untuk Darian karena memberikan tautan ke sumber - tampaknya zamoldar menjiplak tanpa memberikan kredit. Karena menyediakan tautan sumber itu, dan dengan demikian meningkatkan diskusi , saya mengangkat jawaban ini, terlepas dari kritik saya terhadapnya.
ToolmakerSteve

1
Darian, dua perbaikan yang bisa dilakukan: 1) gunakan char.IsWhiteSpace( array[ i -1 ] )alih-alih .. == ' ', untuk menangani semua ruang putih. 2) menghapus dua tempat yang melakukan if (char.isLower(..))- mereka tidak ada gunanya. ToUpperhanya tidak melakukan apa-apa jika karakter bukan huruf kecil.
ToolmakerSteve

0

Memperluas pertanyaan Carlos di atas, jika Anda ingin menggunakan banyak kalimat, Anda dapat menggunakan kode ini:

    /// <summary>
    /// Capitalize first letter of every sentence. 
    /// </summary>
    /// <param name="inputSting"></param>
    /// <returns></returns>
    public string CapitalizeSentences (string inputSting)
    {
        string result = string.Empty;
        if (!string.IsNullOrEmpty(inputSting))
        {
            string[] sentences = inputSting.Split('.');

            foreach (string sentence in sentences)
            {
                result += string.Format ("{0}{1}.", sentence.First().ToString().ToUpper(), sentence.Substring(1)); 
            }
        }

        return result; 
    }

0

Kemungkinan solusi untuk menyelesaikan masalah Anda.

   public static string FirstToUpper(this string lowerWord)
   {
       if (string.IsNullOrWhiteSpace(lowerWord) || string.IsNullOrEmpty(lowerWord))
            return lowerWord;
       return new StringBuilder(lowerWord.Substring(0, 1).ToUpper())
                 .Append(lowerWord.Substring(1))
                 .ToString();
   }
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.