Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 22157|Jawab: 1

[Sumber] C# Generic Range Rover (Turn)

[Salin tautan]
Diposting pada 11/11/2014 08.56.04 | | |
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 :-)





Mantan:Ada beberapa jenis rollup untuk koleksi di C#
Depan:Posting SOS, saya harap Tuhan akan membantu saya, kata sandi sistem login siswa sekolah lupa, bagaimana cara mendapatkan kembali kata sandi untuk mendapatkan bantuan? Terima kasih sebelumnya
Diposting pada 24/11/2014 11.48.29 |
Hilangkan nol pemulihan
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com