Koleksi adalah konsep penting dalam OOP, dan dukungan penuh untuk koleksi dalam C# adalah salah satu bahasa terbaik.
Mengapa menggunakan set generik? Sebelum C# 2.0, koleksi dapat diimplementasikan dengan dua cara utama: a. Gunakan ArrayList Menempatkan objek langsung ke dalam ArrayList adalah intuitif, tetapi karena item dalam koleksi adalah jenis Object, Anda harus melakukan konversi jenis yang membosankan setiap kali Anda menggunakannya. b. Gunakan kelas koleksi kustom Praktik umum adalah mewarisi kelas kustom dari kelas abstrak CollectionBase dan mengimplementasikan kumpulan jenis yang kuat dengan merangkum objek IList. Metode ini membutuhkan penulisan kelas kustom yang sesuai untuk setiap jenis koleksi, yang merupakan banyak pekerjaan. Munculnya koleksi generik memecahkan masalah di atas dengan baik, dan hanya satu baris kode yang dapat digunakan untuk membuat satu set dari jenis tertentu. Apa itu generik? Generik adalah elemen baru dalam C# 2.0 (disebut templat dalam C++) yang terutama digunakan untuk memecahkan serangkaian masalah serupa. Mekanisme ini memungkinkan nama kelas diteruskan sebagai argumen ke jenis generik dan objek yang sesuai dihasilkan. Mungkin lebih baik untuk menganggap generik (termasuk kelas, antarmuka, metode, delegasi, dll.) sebagai templat, di mana bagian varian digantikan oleh nama kelas yang diteruskan sebagai argumen, menghasilkan definisi jenis baru. Generik adalah topik yang relatif besar, dan saya tidak akan menganalisisnya secara rinci di sini, dan mereka yang tertarik dapat berkonsultasi dengan informasi yang relevan. Bagaimana cara membuat koleksi generik? Kelas generik List di bawah namespace System.Collections.Generic <T>digunakan untuk membuat koleksi, dan sintaksnya adalah sebagai berikut: [mw_shl_code=csharp,true] List<T> ListOfT = new List<T>(); [/mw_shl_code] "T" adalah jenis yang akan digunakan, yang dapat berupa jenis sederhana, seperti jenis string, int, atau yang ditentukan pengguna. Mari kita lihat contoh spesifik.
Kelas Person didefinisikan sebagai berikut: [mw_shl_code=csharp,true]orang kelas
{ _name string pribadi; Nama _age int swasta; Usia
Membuat objek Person public Person(string Name, int Age) { this._name= Nama; this._age = Usia; }
Nama string publik Nama { get { return _name; } }
Usia publik int Usia { get { return _age; } }
}
//创建Person对象 Orang p1 = Orang baru ("Zhang San", 30); Orang p2 = Orang baru ("Li Si", 20); Orang p3 = Orang baru ("Wang Wu", 50);
//创建类型为Person的对象集合 Daftar<Person> orang = Daftar baru<Person>();
//将Person对象放入集合 orang. Tambahkan (hal1); orang. Tambahkan (hal2); orang. Tambahkan (hal3);
//输出第2个人的姓名 Console.Write(orang[1]. Nama); [/mw_shl_code] Seperti yang Anda lihat, koleksi generik sangat menyederhanakan kode implementasi koleksi, di mana Anda dapat dengan mudah membuat koleksi jenis tertentu. Tidak hanya itu, koleksi generik juga menyediakan fungsi yang lebih kuat, mari kita lihat penyortiran dan pencarian di dalamnya. Penyortiran koleksi generik Penyortiran didasarkan pada perbandingan, dan untuk menyortir, Anda harus membandingkan terlebih dahulu. Misalnya, jika ada dua angka 1 dan 2, untuk mengurutkannya, kita harus terlebih dahulu membandingkan kedua angka ini dan mengurutkannya sesuai dengan hasil perbandingan. Jika Anda ingin membandingkan objek, situasinya sedikit lebih rumit, misalnya, jika Anda membandingkan objek Orang, Anda dapat membandingkan berdasarkan nama atau usia, yang membutuhkan penentuan aturan perbandingan. Objek dapat memiliki beberapa aturan perbandingan, tetapi hanya satu aturan default, yang ditempatkan di kelas yang mendefinisikan objek. Aturan perbandingan default ditentukan dalam metode CompareTo, yang termasuk dalam antarmuka generik IComparable<T>. Lihat kode di bawah ini: [mw_shl_code=csharp,true]class Person :IComparable<Person>
{ Bandingkan berdasarkan usia publik int Bandingkan(Orang p) { mengembalikan ini. Usia - p.Usia; } }[/mw_shl_code] Parameter metode CompareTo adalah objek lain dari jenis yang sama untuk dibandingkan, nilai yang dikembalikan adalah tipe int, jika nilai yang dikembalikan lebih besar dari 0, itu berarti objek pertama lebih besar dari objek kedua, jika nilai yang dikembalikan kurang dari 0, itu berarti objek pertama kurang dari objek kedua, dan jika mengembalikan 0, kedua objek tersebut sama. Setelah menentukan aturan perbandingan default, Anda dapat mengurutkan koleksi menggunakan metode Sort tanpa parameter, sebagai berikut: [mw_shl_code=csharp,true]// Urutkan koleksi sesuai dengan aturan default orang. Urutkan();
//输出所有人姓名 foreach (Orang p secara pribadi)
{ Console.WriteLine(p.Name); Urutan keluarannya adalah "Li Si", "Zhang San", dan "Wang Wu" }[/mw_shl_code] Dalam praktiknya, seringkali perlu untuk mengurutkan koleksi menurut berbagai aturan yang berbeda, yang memerlukan definisi aturan perbandingan lainnya, yang dapat didefinisikan dalam metode Comparasi, yang termasuk dalam antarmuka generik ICompare<T>, silakan lihat kode berikut: [mw_shl_code=csharp,true]kelas NameComparer : IComparer<Person>
{ Instans sequencer penyimpanan publik statis NameComparer Default = NameComparer(); baru
Bandingkan berdasarkan nama publik int Bandingkan(Orang p1, Orang p2) { mengembalikan System.Collections.Comparer.Default.Compare(p1. Nama, hlm2. Nama); } }[/mw_shl_code] Parameter metode Compare adalah dua objek dari jenis yang sama untuk dibandingkan, dan nilai yang ditampilkan adalah jenis int, dan aturan pemrosesan nilai yang ditampilkan sama dengan metode CompareTo. Comparer.Default mengembalikan objek Comparer bawaan untuk membandingkan dua objek dengan jenis yang sama. Berikut cara mengurutkan koleksi dengan pembanding yang baru ditentukan ini: [mw_shl_code=csharp,true]//Urutkan koleksi berdasarkan nama orang. Sort(NameComparer.Default);
//输出所有人姓名 foreach (Orang p secara pribadi)
{ Console.WriteLine(p.Name); Urutan keluarannya adalah "Li Si", "Wang Wu", dan "Zhang San" }[/mw_shl_code] Anda juga dapat mengurutkan koleksi dengan mendelegasikan, pertama-tama, tentukan metode yang akan dipanggil delegasi untuk menyimpan aturan perbandingan, dan Anda dapat menggunakan metode statis. Lihat kode di bawah ini: [mw_shl_code=csharp,true]perbandingan orang.
{ Bandingkan berdasarkan nama publik statis int Nama(Orang p1, Orang p2) { mengembalikan System.Collections.Comparer.Default.Compare(p1. Nama, hlm2. Nama); } }[/mw_shl_code] Parameter metode adalah dua objek dengan jenis yang sama untuk dibandingkan, nilai yang ditampilkan adalah jenis int, dan aturan pemrosesan nilai pengembalian sama dengan metode CompareTo.Kemudian urutkan koleksi melalui delegasi generik bawaan System.Comparison<T>: [mw_shl_code=csharp,true] <Person> System.Comparison NameComparison = system.Comparison<Person>(PersonComparison.Name); orang. Urutkan (Perbandingan Nama);
//输出所有人姓名 foreach (Orang p secara pribadi)
{ Console.WriteLine(p.Name); Urutan keluarannya adalah "Li Si", "Wang Wu", dan "Zhang San" }[/mw_shl_code] Dapat dilihat bahwa dua metode terakhir dapat mengurutkan koleksi sesuai dengan aturan yang ditentukan, tetapi penulis lebih suka menggunakan metode delegasi, dan dapat mempertimbangkan untuk menempatkan berbagai aturan perbandingan dalam kelas dan kemudian memanggilnya secara fleksibel. Menelusuri koleksi generik Pencarian adalah untuk menemukan item yang memenuhi kondisi tertentu dari koleksi, dan beberapa kondisi pencarian dapat ditentukan dan dipanggil sesuai kebutuhan. Pertama, tentukan kriteria pencarian sebagai berikut: [mw_shl_code=csharp,true]class PersonPredicate
{ Temukan orang paruh baya (di atas 40 tahun) bool statis publik MidAge (Orang p) { if (p.Usia >= 40) mengembalikan benar; yang lain mengembalikan false; } }[/mw_shl_code] Kriteria pencarian di atas ditempatkan dalam metode statis dengan jenis pengembalian Boolean, dan item dalam koleksi yang memenuhi kondisi tertentu mengembalikan true, jika tidak false.Kemudian cari koleksi melalui delegasi generik bawaan System.Predicate<T>: [mw_shl_code=csharp,true] System.Predicate<Person> MidAgePredicate = new System.Predicate<Person>(PersonPredicate.MidAge); Daftar<Person> MidAgePersons = orang. FindAll(Predikat Pertengahan Umur);
//输出所有的中年人姓名 foreach (Orang p di MidAgePersons)
{ Console.WriteLine(p.Name); Keluaran "Wang Wu" }[/mw_shl_code] Perpanjangan koleksi generik Bagaimana jika Anda ingin mendapatkan nama semua orang dalam set, dipisahkan oleh koma? Mengingat bahwa fungsionalitas yang dapat disediakan oleh satu kelas terbatas, wajar untuk berpikir <T>untuk memperluas kelas List, yang juga merupakan kelas dan oleh karena itu dapat diperluas dengan pewarisan. Lihat kode di bawah ini: [mw_shl_code=csharp,true]// Tentukan kelas koleksi Orang kelas Orang: Daftar<Person>
{ Mendapatkan nama semua orang dalam koleksi string publik GetAllNames() { jika (ini. Hitungan == 0) kembalikan "";
string val = ""; foreach (Orang p dalam ini) { val += p.Name + ","; }
kembali val. Substring(0, val. Panjang - 1); }
}
//创建并填充Persons集合 Orang PersonCol = Orang baru (); OrangCol.Tambahkan (hal1); PersonCol.Add(hal2); OrangCol.Add(hal3);
//输出所有人姓名 Console.Write(PersonCol.GetAllNames()); Keluaran "Zhang San, Li Si, Wang Wu"[/mw_shl_code] Ringkasan: Artikel ini berfokus pada penggunaan generik di C# 2.0 untuk mengimplementasikan koleksi, serta untuk memperluas fungsi koleksi, dan penggunaan koleksi generik yang tepat dapat mengurangi banyak duplikasi pekerjaan dan sangat meningkatkan efisiensi pengembangan. Faktanya, set hanyalah aplikasi khas generik, dan jika Anda ingin tahu lebih banyak tentang generik, Anda dapat berkonsultasi dengan materi lain yang relevan. Semoga artikel ini bermanfaat bagi Anda :-)
|