Saya mencoba mengurutkan deretan angka yang merupakan string dan saya ingin mereka mengurutkan secara numerik.
Hasil tangkapannya adalah saya tidak bisa mengubah angka menjadi int .
Ini kodenya:
string[] things= new string[] { "105", "101", "102", "103", "90" };
foreach (var thing in things.OrderBy(x => x))
{
Console.WriteLine(thing);
}
keluaran: 101, 102, 103, 105, 90
Saya suka: 90, 101, 102, 103, 105
EDIT: Outputnya tidak boleh 090, 101, 102 ...
Memperbarui contoh kode menjadi "benda" bukan "ukuran". Array bisa menjadi seperti ini:
string[] things= new string[] { "paul", "bob", "lauren", "007", "90" };
Itu berarti perlu diurutkan menurut abjad dan nomor:
007, 90, bob, lauren, paul
image10
datang setelahimage2
? HaruskahJanuary
datang sebelumnyaFebruary
?Jawaban:
Meneruskan pembanding kustom ke OrderBy. Enumerable.OrderBy akan membiarkan Anda menentukan pembanding yang Anda suka.
Ini adalah salah satu cara untuk melakukannya:
sumber
IsNumeric
Metode buruk, Exception didorong coding selalu buruk. Gunakanint.TryParse
sebagai gantinya. Coba kode Anda dengan daftar besar dan itu akan berlangsung selamanya.Cukup pad dengan nol dengan panjang yang sama:
sumber
sizes
juga tidak akan berhasil, karena hasilnya adalah tipe yang berbeda. Jawabannya agak singkat, di baris kedua menunjukkan hasil sebagai ekspresi, tetapi terserah pembaca untuk melakukan sesuatu dengannya. Saya telah menambahkan tugas variabel lain untuk membuatnya lebih jelas.Dan, bagaimana dengan ini ...
sumber
"b", "ab", "101", "103", "bob", "abcd"
.Nilai adalah string
Bekerja
sumber
string[] { "Object 1", "Object 9", "Object 14" }
"b", "ab", "101", "103", "bob", "abcd"
.Ada fungsi asli di windows
StrCmpLogicalW
yang akan membandingkan angka string sebagai angka, bukan huruf. Sangat mudah untuk membuat pembanding yang memanggil fungsi itu dan menggunakannya untuk perbandingannya.Ia bahkan bekerja pada string yang memiliki teks dan angka. Berikut adalah contoh program yang akan menunjukkan perbedaan antara pengurutan default dan
StrCmpLogicalW
pengurutankeluaran yang mana
sumber
-1 0 10 2
diurutkan sebagai0 -1 2 10
coba ini
Catatan: ini akan membantu ketika semua string dapat diubah menjadi int .....
sumber
ToList()
before =>sizes.ToList().OrderBy(x => Convert.ToInt32(x))
Saya kira ini akan jauh lebih baik jika memiliki beberapa angka dalam string. Semoga bisa membantu.
PS: Saya tidak yakin tentang kinerja atau nilai string yang rumit tetapi bekerja dengan baik seperti ini:
lorem ipsum
lorem ipsum 1
lorem ipsum 2
lorem ipsum 3
...
lorem ipsum 20
lorem ipsum 21
sumber
Kamu bilang kamu tidak bisa mengubah angka menjadi int karena array bisa berisi elemen yang tidak bisa diubah menjadi int, tapi tidak ada salahnya mencoba:
Kemudian bandingkan seperti ini:
Keluaran: 007, 90, 90, 101, 102, 103, 105, bob, lauren, paul
sumber
Ini sepertinya permintaan yang aneh dan pantas mendapatkan solusi yang aneh:
sumber
Situs ini membahas pengurutan alfanumerik dan akan mengurutkan angka dalam arti logis, bukan dalam pengertian ASCII. Ini juga memperhitungkan alfa di sekitarnya:
http://www.dotnetperls.com/alphanumeric-sorting
CONTOH:
Kodenya adalah sebagai berikut:
sumber
Jawaban yang diberikan oleh Jeff Paulsen benar tetapi
Comprarer
dapat disederhanakan menjadi ini:Ini berfungsi karena satu-satunya hal yang diperiksa untuk hasil
Comparer
adalah jika hasilnya lebih besar, lebih kecil atau sama dengan nol. Seseorang dapat dengan mudah mengurangi nilai dari yang lain dan tidak harus menangani nilai yang dikembalikan.Juga
IsNumeric
metode ini tidak harus menggunakantry
-block dan bisa mendapatkan keuntunganTryParse
.Dan bagi mereka yang tidak yakin: Pembanding ini akan mengurutkan nilai sehingga nilai non numerik selalu ditambahkan ke akhir daftar. Jika seseorang menginginkannya di awal,
if
blok kedua dan ketiga harus ditukar.sumber
Coba ini :
sumber
arr = arr.OrderBy (x => x, NaturalSort baru ()). ToArray ();
Alasan saya membutuhkannya adalah untuk mengajukannya ke direktori yang nama filenya dimulai dengan angka:
sumber
Sekarang Sortir daftar dan gabungkan kembali ...
Saya hanya mencoba memberikan kontribusi dalam pertanyaan menarik ini ...
sumber
Solusi pilihan saya (jika semua string hanya numerik):
sumber
sumber
Memperluas jawaban Jeff Paulsen. Saya ingin memastikan tidak masalah berapa banyak jumlah atau kelompok karakter dalam string:
Saya juga mengambil SplitCharsAndNums dari SO Page setelah mengubahnya untuk menangani nama file.
sumber
Meskipun ini pertanyaan lama, saya ingin memberikan solusi:
Woha cukup sederhana bukan? : D
sumber
sumber