Apakah ada cara untuk memformat string dengan nama daripada posisi di C #?
Dengan python, saya dapat melakukan sesuatu seperti contoh ini (tanpa malu dicuri dari sini ):
>>> print '%(language)s has %(#)03d quote types.' % \
{'language': "Python", "#": 2}
Python has 002 quote types.
Apakah ada cara untuk melakukan ini di C #? Katakan misalnya:
String.Format("{some_variable}: {some_other_variable}", ...);
Mampu melakukan ini menggunakan nama variabel akan menyenangkan, tetapi kamus juga dapat diterima.
c#
.net-3.5
string-formatting
Jason Baker
sumber
sumber
Jawaban:
Tidak ada metode bawaan untuk menangani ini.
Inilah satu metode
Ini satu lagi
Metode ketiga ditingkatkan sebagian berdasarkan pada dua di atas , dari Phil Haack
sumber
Saya memiliki implementasi yang baru saja saya posting ke blog saya di sini: http://haacked.com/archive/2009/01/04/fun-with-named-formats-string-parsing-and-edge-cases.aspx
Ini membahas beberapa masalah yang dimiliki oleh implementasi lain ini dengan penjepit melarikan diri. Posting memiliki detail. Itu DataBinder.Eval hal juga, tetapi masih sangat cepat.
sumber
String interpolasi ditambahkan ke C # 6.0 dan Visual Basic 14
Keduanya diperkenalkan melalui kompiler Roslyn baru di Visual Studio 2015 .
C # 6.0:
return "\{someVariable} and also \{someOtherVariable}"
ATAUreturn $"{someVariable} and also {someOtherVariable}"
sumber: apa yang baru di C # 6.0
VB 14:
return $"{someVariable} and also {someOtherVariable}"
Fitur yang patut diperhatikan (dalam Visual Studio 2015 IDE):
{index}
berfungsi, tetapi juga{(index + 1).ToString().Trim()}
Nikmati! (& klik "Kirim Senyum" di VS)
sumber
Anda juga dapat menggunakan jenis anonim seperti ini:
Tentu saja akan membutuhkan lebih banyak kode jika Anda juga ingin mem-parsing pemformatan, tetapi Anda dapat memformat string menggunakan fungsi ini seperti:
sumber
Tampaknya tidak ada cara untuk melakukan ini di luar kotak. Meskipun, tampaknya layak untuk menerapkan
IFormatProvider
tautan Anda sendiri keIDictionary
nilai untuk.Output:
Peringatannya adalah bahwa Anda tidak dapat mencampur
FormatProviders
, sehingga pemformatan teks mewah tidak dapat digunakan pada saat yang sama.sumber
Kerangka itu sendiri tidak menyediakan cara untuk melakukan ini, tetapi Anda dapat melihat posting ini oleh Scott Hanselman. Contoh penggunaan:
Kode ini oleh James Newton-King serupa dan bekerja dengan sub-properti dan indeks,
Kode James bergantung pada System.Web.UI.DataBinder untuk mengurai string dan membutuhkan referensi System.Web, yang beberapa orang tidak suka melakukannya di aplikasi non-web.
EDIT: Oh dan mereka bekerja dengan baik dengan tipe anonim, jika Anda tidak memiliki objek dengan properti yang siap untuk itu:
sumber
Lihat /programming/271398?page=2#358259
Dengan ekstensi ditautkan ke Anda dapat menulis ini:
dan Anda akan mendapatkan
"foo 2 System.Object
".sumber
Saya pikir yang paling dekat Anda akan dapatkan adalah format diindeks:
Ada juga String.Replace (), jika Anda bersedia melakukannya dalam beberapa langkah dan percaya bahwa Anda tidak akan menemukan 'variabel' Anda di tempat lain di string:
Memperluas ini untuk menggunakan Daftar:
Anda dapat melakukannya dengan Kamus <string, string> juga dengan mengulangi itu .Keys koleksi, tetapi dengan menggunakan Daftar <KeyValuePair <string, string >> kita dapat mengambil keuntungan dari metode .ForEach () Daftar dan mengembun kembali ke satu baris:
Lambda akan lebih sederhana, tapi saya masih menggunakan .Net 2.0. Perhatikan juga bahwa kinerja .Replace () tidak menjadi bintang ketika digunakan secara iteratif, karena string dalam .Net tidak dapat diubah. Juga, ini membutuhkan
MyString
variabel yang didefinisikan sedemikian rupa sehingga dapat diakses oleh delegasi, sehingga belum sempurna.sumber
Pustaka sumber terbuka saya, Regextra , mendukung pemformatan bernama (antara lain). Saat ini menargetkan .NET 4.0+ dan tersedia di NuGet . Saya juga memiliki posting blog pengantar tentang hal itu: Regextra: membantu Anda mengurangi (masalah) Anda {2} .
Bit pemformatan yang dinamai mendukung:
Contoh:
Hasil:
Lihatlah tautan GitHub proyek (di atas) dan wiki untuk contoh lainnya.
sumber
Periksa ini:
Sampel:
Performanya lumayan ok dibanding solusi lain.
sumber
Saya ragu ini akan mungkin. Hal pertama yang terlintas dalam pikiran adalah bagaimana Anda akan mendapatkan akses ke nama variabel lokal?
Mungkin ada beberapa cara pintar menggunakan ekspresi LINQ dan Lambda untuk melakukan ini.
sumber
Ini yang saya buat beberapa waktu lalu. Itu memperluas String dengan metode Format mengambil argumen tunggal. Yang menyenangkan adalah ia akan menggunakan string standar. Sesuai jika Anda memberikan argumen sederhana seperti int, tetapi jika Anda menggunakan sesuatu seperti tipe anonim, itu juga akan berfungsi.
Contoh penggunaan:
Akan menghasilkan "Keluarga Smith memiliki 4 anak."
Itu tidak melakukan hal-hal yang mengikat gila seperti array dan pengindeks. Tapi itu super sederhana dan berkinerja tinggi.
sumber
Contoh:
Output: 你好, wayjet, 今天 是 2011-05-04, 这 是 你 第 18 次 登录 , 积分 {100.40}
sumber
di sini adalah metode sederhana untuk objek apa pun:
Dan di sini cara menggunakannya:
output: 2/27/2012
sumber
Saya menerapkan ini adalah kelas sederhana yang menduplikasi fungsi String.Format (kecuali saat menggunakan kelas). Anda bisa menggunakan kamus atau tipe untuk menentukan bidang.
https://github.com/SergueiFedorov/NamedFormatString
C # 6.0 menambahkan fungsionalitas ini langsung ke spesifikasi bahasa, demikian
NamedFormatString
juga untuk kompatibilitas mundur.sumber
Saya memecahkan ini dengan cara yang sedikit berbeda dengan solusi yang ada. Itu inti dari penggantian item bernama (bukan bit refleksi bahwa beberapa telah dilakukan). Ini sangat cepat dan sederhana ... Ini adalah solusi saya:
Ini digunakan dengan cara berikut:
Semoga seseorang menemukan ini berguna!
sumber
Meskipun jawaban yang diterima memberikan beberapa contoh yang baik, .Inject serta beberapa contoh Haack tidak menangani pelolosan. Banyak juga sangat bergantung pada Regex (lebih lambat), atau DataBinder.Eval yang tidak tersedia di .NET Core, dan di beberapa lingkungan lain.
Dengan pemikiran itu, saya telah menulis parser berbasis mesin sederhana yang mengalir melalui karakter, menulis ke
StringBuilder
output, karakter demi karakter. Ini diimplementasikan sebagaiString
metode ekstensi dan dapat menggunakan parameter aDictionary<string, object>
atauobject
dengan sebagai input (menggunakan refleksi).Ini menangani level tak terbatas
{{{escaping}}}
dan melemparFormatException
ketika input mengandung kawat gigi yang tidak seimbang dan / atau kesalahan lainnya.Pada akhirnya, semua logika bermuara menjadi 10 status utama - Karena ketika mesin negara berada di luar braket dan juga di dalam braket, karakter selanjutnya adalah penjepit terbuka, penjepit terbuka keluar, penjepit tertutup, penjepit tertutup lolos, atau karakter biasa. Masing-masing kondisi ini ditangani secara individual saat loop berlanjut, menambahkan karakter ke output
StringBuffer
atau kunciStringBuffer
. Ketika parameter ditutup, nilai kunciStringBuffer
digunakan untuk mencari nilai parameter dalam kamus, yang kemudian didorong ke outputStringBuffer
. Pada akhirnya, nilai outputStringBuffer
dikembalikan.sumber
Sunting: Yang seharusnya saya katakan adalah, "Tidak, saya tidak percaya apa yang ingin Anda lakukan didukung oleh C #. Ini sedekat yang Anda akan dapatkan."
sumber
"someString" + someVariable + "someOtherString"
lebih mudah dibaca. Artikel ini setuju dengan Anda.