C # Syntax - Pisahkan String menjadi Array dengan Comma, Convert To Generic List, dan Reverse Order

92

Apa sintaks yang benar untuk ini:

IList<string> names = "Tom,Scott,Bob".Split(',').ToList<string>().Reverse();

Apa yang saya lakukan? Apa TSource artinya?

BuddyJoe
sumber

Jawaban:

254

Masalahnya adalah Anda menelepon List<T>.Reverse()yang kembali void.

Anda bisa melakukan:

List<string> names = "Tom,Scott,Bob".Split(',').ToList<string>();
names.Reverse();

atau:

IList<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>();

Yang terakhir lebih mahal, karena membalikkan sewenang-wenang IEnumerable<T>melibatkan buffering semua data dan kemudian menghasilkan semuanya - sedangkan List<T>dapat melakukan semua pembalikan "di tempat". (Perbedaannya di sini adalah ia memanggil Enumerable.Reverse<T>()metode ekstensi, bukan List<T>.Reverse()metode instance.)

Lebih efisien lagi, Anda dapat menggunakan:

string[] namesArray = "Tom,Scott,Bob".Split(',');
List<string> namesList = new List<string>(namesArray.Length);
namesList.AddRange(namesArray);
namesList.Reverse();

Hal ini untuk menghindari pembuatan buffer dengan ukuran yang tidak tepat - dengan biaya mengambil empat pernyataan yang akan dilakukan ... Seperti biasa, pertimbangkan keterbacaan terhadap kinerja dalam kasus penggunaan yang sebenarnya.

Jon Skeet
sumber
25
skeet adalah binatang!
daging
2
diuraikan dengan baik, saya sangat menghargai!
Gaurav Aroraa
11

Saya menyadari bahwa pertanyaan ini cukup lama, tetapi saya memiliki masalah serupa, kecuali string saya memiliki spasi di dalamnya. Bagi mereka yang perlu mengetahui cara memisahkan string dengan lebih dari sekadar koma:

string str = "Tom, Scott, Bob";
  IList<string> names = str.Split(new string[] {","," "},
  StringSplitOptions.RemoveEmptyEntries);

StringSplitOptions menghapus rekaman yang hanya berupa karakter spasi ...

Des Horsley
sumber
Ini tidak akan berfungsi jika Anda memiliki "Tom Cruise" dan bukan hanya Tom
membakar
4
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();

Yang ini berhasil.

Rune Grimstad
sumber
2

Coba ini:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();
Yona
sumber
Saya mendapatkan kesalahan - Tidak dapat secara implisit mengubah jenis 'void' menjadi 'System.Collections.Generic.List <string>
BuddyJoe
1

Apa yang Anda lewatkan di sini adalah bahwa .Reverse () adalah metode kosong. Tidak mungkin untuk menetapkan hasil .Reverse () ke variabel. Namun Anda dapat mengubah urutan untuk menggunakan Enumerable.Reverse () dan mendapatkan hasil Anda

var x = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>()

Perbedaannya adalah bahwa Enumerable.Reverse () mengembalikan IEnumerable <T> alih-alih menjadi void return

JaredPar
sumber
1

Jika Anda mencoba

  1. Gunakan beberapa pembatas
  2. Filter string kosong apa pun
  3. Pangkas spasi di depan / di belakang

berikut ini harus bekerja:

string str = "Tom Cruise, Scott, ,Bob | at";
IEnumerable<string> names = str
                            .Split(new char[]{',', '|'})
                            .Where(x=>x!=null && x.Trim().Length > 0)
                            .Select(x=>x.Trim());

Keluaran

  • Tom
  • Pelayaran
  • Scott
  • Bob
  • di

Sekarang Anda jelas dapat membalik urutan seperti yang disarankan orang lain.

terang benderang
sumber