Aku punya DetailsView
dengan 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 ToTitleCase
metode. (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 .
sumber
Jawaban:
Diperbarui ke C # 8
C # 7
Jawaban yang benar-benar tua
EDIT : Versi ini lebih pendek. Untuk solusi yang lebih cepat lihat jawaban Equiso
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 dariTextbox
.sumber
String.Join
adalah pemisah yang digunakan untuk menggabungkan string yang diberikan dengan parameter kedua.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 melewatkanString.Join
). Ini tentu saja tergantung pada panjang senarnya."Argh!"
sesuai dengan aturan Huruf Pertama Huruf Besar . ;)Jawaban lama: Ini membuat setiap huruf pertama menjadi huruf besar
sumber
Cara yang benar adalah dengan menggunakan Budaya:
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".
sumber
ToLower
adalah kesalahan, karena menghapus huruf besar di tengah kata, misalnya "McDonalds". 3) Pertanyaannya adalah tentang mengubah hanya kata pertama dari string , bukan tentang TitleCase.Saya mengambil metode tercepat dari http://www.dotnetperls.com/uppercase-first-letter dan dikonversi ke metode ekstensi:
CATATAN: Alasan menggunakan
ToCharArray
lebih cepat daripada alternatifchar.ToUpper(s[0]) + s.Substring(1)
, adalah bahwa hanya satu string yang dialokasikan, sedangkanSubstring
pendekatan 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 :
sumber
return string.Empty
sini akan menyembunyikan panggilan "buruk" ke metode.Anda dapat menggunakan "metode ToTitleCase"
metode perluasan ini menyelesaikan setiap masalah titlecase.
mudah digunakan
metode Extention
sumber
FirstLetterToUpper
dalam jawaban Equiso (atau dalam jawaban Guillernet yang lebih baru), dan diToTitleCase
sini, tetapi tanpa parameter kedua. Maka tidak perluenum TitleCase
.Untuk huruf pertama, dengan pengecekan error:
Dan ini sama dengan ekstensi yang berguna
sumber
sumber
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.
sumber
char[]
daripada memiliki semua infrastruktur yangStringBuilder
membungkusnya. Alih-alihnew StringBuilder(str)
, gunakanstr.ToCharArray()
, dan bukannyasb.ToString()
, gunakannew string(charArray)
.StringBuilder
mengemulasi jenis pengindeksan yang diekspos oleh array karakter secara asli, sehingga.ToUpper
baris aktual pada dasarnya bisa sama. :-)ToCharArray
, seperti yang disarankan oleh @JonathanGilbertMetode tercepat.
Tes menunjukkan hasil selanjutnya (string dengan 10000000 simbol sebagai input): Hasil tes
sumber
s
parameter ketika nol atau kosong.Coba ini:
sumber
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.
Kita perlu mengonversi karakter pertama ToString () karena kita membacanya sebagai array Char, dan tipe Char tidak memiliki metode ToUpper ().
sumber
Berikut cara untuk melakukannya sebagai metode ekstensi:
Kemudian bisa disebut seperti:
Dan inilah beberapa unit test untuknya:
sumber
string.Format
berlebihan; lakukan sajatext.Substring(0, 1).ToUpper() + text.Substring(1)
.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.
Saya yakin ada cara untuk mengoptimalkan atau membersihkan ini sedikit.
sumber
Saya menemukan sesuatu di sini http://www.dotnetperls.com/uppercase-first-letter :
mungkin ini bisa membantu !!
sumber
Periksa apakah string bukan nol, lalu konversi karakter pertama ke huruf besar dan sisanya menjadi huruf kecil:
sumber
Ini akan melakukannya walaupun itu juga akan memastikan bahwa tidak ada modal yang salah yang tidak ada di awal kata.
sumber
s
sebelum panggilan ke ToTitleCase.Tampaknya ada banyak kerumitan di sini ketika yang Anda butuhkan adalah:
Poin penting:
Ini merupakan metode ekstensi.
Jika inputnya nol, kosong atau kosong, maka input akan dikembalikan apa adanya.
String.IsNullOrWhiteSpace diperkenalkan dengan .NET Framework 4. Ini tidak akan bekerja dengan kerangka kerja yang lebih lama.
sumber
IsNullOrWhiteSpace
daripadaIsNullOrEmpty
, adalah jika Anda akan menemukan dan mengubah yang pertama ruang putih . Tapi Anda tidak - Anda selalu beroperasis[0]
. Jadi tidak ada gunanya [baik secara semantik maupun kinerja] untuk digunakanIsNullOrWhiteSpace
.IsNullOrWhiteSpace
masalah 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, penggunaanIsNullOrWhiteSpace
hanya dapat menyesatkan pembaca.sumber
String
adalah bisa apa sajaUpper
atauLower
jadi solusi generik untuk semua string.Join
bukannyaemp.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 perluToLower()
untuk pertanyaan OP.Substring
juga gaya penulisan kode yang baik, saya setuju solusi Anda untuk memangkas kode tetapi dalam hal ini menulisToLower()
adalah praktik pemrograman yang baik.string
bisa apa saja DalamUpper
kasus atauLower
kasus tergantung pada input pengguna, saya memberikan solusi generik.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:
Memberikannya sebagai parameter opsional membuat metode ini benar-benar dapat digunakan kembali, tanpa harus mengetik budaya yang dipilih setiap saat.
sumber
Baru-baru ini saya memiliki persyaratan yang sama dan ingat bahwa fungsi LINQ Select () memberikan indeks:
Karena saya sangat membutuhkannya, saya membuat metode ekstensi untuk tipe string:
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.
sumber
Saya pikir metode di bawah ini adalah solusi terbaik
ref
sumber
Karena pertanyaan ini adalah tentang memaksimalkan kinerja, saya mengadopsi versi Darren untuk digunakan
Span
, yang mengurangi sampah dan meningkatkan kecepatan sekitar 10%.Performa
Kode uji lengkap
Sunting: Ada typeo, bukannya s [0], adalah [0] - hasil ini dengan cupying sama, nilai kosong untuk Rentang yang dialokasikan a.
sumber
Huruf ini menjadi huruf kapital pertama dan setiap huruf setelah spasi dan huruf kecil huruf lainnya.
sumber
Gunakan kode berikut:
sumber
Sepertinya tidak ada solusi yang diberikan di sini akan berurusan dengan ruang putih sebelum string.
Hanya menambahkan ini sebagai pemikiran:
Seharusnya menangani
this won't work on other answers
(kalimat itu memiliki spasi di awal), dan jika Anda tidak suka pemangkasan ruang, cukup berikanfalse
parameter sebagai kedua (atau ubah ke defaultfalse
, dan berikantrue
jika Anda ingin berurusan dengan spasi)sumber
FluentSharp memiliki
lowerCaseFirstLetter
metode yang melakukan inihttps://github.com/o2platform/FluentSharp/blob/700dc35759db8e2164771a71f73a801aa9379074/FluentSharp.CoreLib/ExtensionMethods/System/String_ExtensionMethods.cs#L575
sumber
Cara termudah untuk Memanfaatkan huruf pertama adalah:
1- Menggunakan Sytem.Globalisasi;
`
sumber
fungsi berikut ini benar untuk semua cara:
Saya menemukan itu di sini
sumber
char.IsWhiteSpace( array[ i -1 ] )
alih-alih.. == ' '
, untuk menangani semua ruang putih. 2) menghapus dua tempat yang melakukanif (char.isLower(..))
- mereka tidak ada gunanya.ToUpper
hanya tidak melakukan apa-apa jika karakter bukan huruf kecil.Memperluas pertanyaan Carlos di atas, jika Anda ingin menggunakan banyak kalimat, Anda dapat menggunakan kode ini:
sumber
Kemungkinan solusi untuk menyelesaikan masalah Anda.
sumber